如何检查一个对象是否部分包含另一个?

时间:2017-11-24 18:43:39

标签: javascript ecmascript-6

所以我试图检查一个对象是否包含另一个/部分。例如,我想检查{ a: 1, b: 2, c: 2 }是否包含{ a: 1, b: 2 }。但必须按顺序排列。如果a是第一个元素并排成一行,则b元素必须在之后完全排列。加上他们无论如何我可以检查那里的价值? 订单很重要

//Here is my code currently:
function whatIsInAName(collection, source) {
    var array = [];
    var sourceNames = Object.getOwnPropertyNames(source);
  for (var i = 0; i < collection.length; i++) {
         var collectionNames = Object.getOwnPropertyNames(collection[i])
        JSON.stringify(collectionNames).includes(JSON.stringify(sourceNames)) ?  array.push(collection[i]) : null
      }
      return array
}

whatIsInAName([{ a: 1, b: 2 }, { a: 1 }, { a: 1, b: 2, c: 2 }], { a: 1, b: 2 });

这是一个确切的检查,但仅限于名称。我希望它也比较了价值观。

它也没有部分检查另一个对象。就像comaparing { a: 1, b: 2, c: 2 }包含{ a: 1, b: 2 }

一样

这是我给出的挑战 - &gt; https://www.freecodecamp.org/challenges/wherefore-art-thou

2 个答案:

答案 0 :(得分:0)

您可以使用单个对象的键来比较值,并使用every返回结果以过滤对象数组。

function compare(array, object) {
    return array.filter(function (o) {
        return Object.keys(object).every(function (k) {
            return k in o && object[k] === o[k];
        });
    });
}

console.log(compare([{ a: 1, b: 2 }, { a: 1 }, { a: 1, b: 2, c: 2 }], { a: 1, b: 2 }));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

我试图引导您在评论中自行解决问题,但如果您只是在寻找解决方案,那么您可以使用基本的JavaScript结构来实现这一目标(没有什么比{ {1}}和Array#filter)。

它可能比其他一些解决方案长得多,但它利用了JavaScript的基础知识:

&#13;
&#13;
Array#every
&#13;
&#13;
&#13;