检查对象的一部分是否包含另一个整个对象

时间:2018-11-29 16:09:45

标签: javascript

我有一个动态的大对象,但它具有如下所示的简单结构:

let numbers = {
    one:   true,
    two:   false,
    three: false,
    four:  true,
    five:  true,
    six:   false,
    seven: false,
    eight: false,
    nine:  false,
    ten:   false
};

,然后是一个较小的对象数组,这些对象是动态的,可能包含或不包含第一个对象的值。

let input = [{ one: true, four: true, five: true}, { one: true, two: true, three: true, ten: true}];

因此,我需要查看第二个对象中的所有属性是否与第一个对象中的相应属性完全匹配。在上述情况下,第一个对象将是一个匹配项,但第二个对象将失败,因为ten: true与第一个对象中的相应属性不匹配。

这是我想出的,但是它看起来效率很低,我不禁想到还有更好的方法:

checkMatch(numbers, input) {

    for (let obj of input) {
        let count = 0;

        for (let key of obj) {
            if (numbers[key]) count++;
        }

        if (count == Object.keys(obj).length) console.log('match');
        else console.log('no match');
    }

}

3 个答案:

答案 0 :(得分:1)

您可以迭代这些条目,并检查原始对象是否包含属性和值。

const
    check = o => Object.entries(o).every(([k, v]) => k in numbers && numbers[k] === v),
    numbers = { one: true, two: false, three: false, four: true, five: true, six: false, seven: false, eight: false, nine: false, ten: false },
    input = [{ one: true, four: true, five: true }, { one: true, two: true, three: true, ten: true }];

console.log(input.map(check));

答案 1 :(得分:1)

您可以在Array#every()上使用Object.entries()

let numbers = {
    one:   true,
    two:   false,
    three: false,
    four:  true,
    five:  true,
    six:   false,
    seven: false,
    eight: false,
    nine:  false,
    ten:   false
};

let input = [{ one: true, four: true, five: true}, { one: true, two: true, three: true, ten: true}];

input.forEach(o=>{
   const isMatch = Object.entries(o).every(arr=> numbers[arr[0]] == arr[1])
   console.log( [isMatch,o] );
})

答案 2 :(得分:0)

您可以使用every进行迭代并检查密钥,以匹配所有

let input = [{
  one: true,
  four: true,
  five: true
}, {
  one: true,
  two: true,
  three: true,
  ten: true
}];
let numbers = {
  one: true,
  two: false,
  three: false,
  four: true,
  five: true,
  six: false,
  seven: false,
  eight: false,
  nine: false,
  ten: false
};



input.forEach(a => {
  var matches = Object.keys(a).every(b => numbers[b] === a[b]);
  console.log(matches);
})