1

次の形式のオブジェクトを含むオブジェクトがあります。

bigObject: {
    "a - values": { atr: true}
    "a - items": { atr: true}
    "a - others": { atr: false}
    "b - values": { atr: true}
    "b - items": { atr: true}
    "b - others": { atr: false}
    "c - values": { atr: false}
    "c - items": { atr: true}
    "c - others": { atr: false}
}

関数内でこのオブジェクトを使用して、属性の 1 つがブール値を変更するたびにチェックします。onButtonClicked(item)

それは次のようなことをします:

onButtonClicked(item) {
    bigObject[item.id].atr= !bigObject[item.id].atr;
}

aこの関数内で、で始まるオブジェクトの値bを個別に確認できるように、それらを分割したいと考えていますc。そのために私はしました:const toCheck = item.id.split("-")[0];

これは問題なく動作し、そのオブジェクトがクリックされた場合、 a で始まるオブジェクトのみが取得されます。

次のステップは、特定の文字にと の両方trueの属性があるかどうかを確認することです。false

このために、私は次のようにしようとしました:

let countFalse = 0;
let countTrue = 0;

 bigObject.forEach(x => {
    if ((x.split("-")[0]) === toCheck) {
        if (x.atr) {
            countTrue++;
        } else countFalse++;
    }
    if (countTrue && countFalse) {
        console.log("has both true and false attributes");
    } else console.log("nope");
 });

そのため、元の名前を分割して (値、項目、その他) を取り除き、その後、true 属性と false 属性を数えようとしています。両方ある場合は、そうでないことを示すメッセージを表示します。

何かが間違っていますが、何がわかりません。何か案は?

4

4 に答える 4

1

' - 'の代わりに で分割してエントリを繰り返すことができます'-'

var bigObject = { "a - values": { atr: true }, "a - items": { atr: true }, "a - others": { atr: false }, "b - values": { atr: true }, "b - items": { atr: true }, "b - others": { atr: false }, "c - values": { atr: false }, "c - items": { atr: true }, "c - others": { atr: false } },
    countFalse = 0,
    countTrue = 0,
    toCheck = 'a';

Object.entries(bigObject).forEach(([k, v]) => {
    if (k.split(" - ")[0] !== toCheck) {
        return;
    }
    if (v.atr) {
        countTrue++;
    } else {
        countFalse++;
    }
});
if (countTrue && countFalse) {
    console.log("has both true and false attributes");
} else {
    console.log("nope");
}

カウント用のオブジェクトを備えた、よりコンパクトなバージョン。

var object = { "a - values": { atr: true }, "a - items": { atr: true }, "a - others": { atr: false }, "b - values": { atr: true }, "b - items": { atr: true }, "b - others": { atr: false }, "c - values": { atr: false }, "c - items": { atr: true }, "c - others": { atr: false } },
    count = { false: 0, true: 0 },
    toCheck = 'a';

Object.entries(object).forEach(([k, { atr }]) => count[atr] += k.startsWith(toCheck));

if (count.true && count.false) {
    console.log("has both true and false attributes");
} else {
    console.log("nope");
}

console.log(count);

于 2018-08-24T12:50:40.177 に答える