JS通过对象检查另一个对象是否包含其值

时间:2016-12-29 15:14:53

标签: javascript arrays object

我试图通过JS对象(1)来查明另一个对象(2)上是否存在值并返回找到值的对象(2)。

var returnObj = [];
    selectedValues.forEach(function(value, key){
        var found = valuesObject.some(function (el) {
            if (el.item_id === value){
                return el.item_id;
            }
        });
        console.log(found);
    });

在这种情况下,我只能通过获取true / false来查明它是否存在,我也尝试过这个

var returnObj = [];
    selectedValues.forEach(function(value, key){
        console.log(_.intersection(valuesObject, value));
    });

但在这种情况下它只返回空数组而不是object(2)值找到的值(1)值

3 个答案:

答案 0 :(得分:1)

如果您在return来电中进行.forEach,则只会退回传递给forEach功能的回调,而不是您的附加功能。你可以使用标准的for循环,在那里你可以退出。

假设您要在第二个对象中找到“值”列表:

const values = [/*...*/];

Object.keys(secondObject).forEach(key => {
  const value = secondObject[key];

  if (values.includes(value)) {
    /* secondObject has a property with the values you are looking for */
  }
});

Object.keys为您提供了一个对象的属性键数组。根据您的环境,您也可以使用Object.values(),这将返回给定对象的值数组(而不是键)。

答案 1 :(得分:1)

保持简单和基本:

for (var i = 0; i < selectedValues.length; i++) {
    for (var j = 0; j < valuesObject.length; j++) {
        if (selectedValues[i] === valuesObject[j].item_id) {
            return valuesObject[j].item_id;
        }
    }
}

如果您更喜欢一行:

return selectedValues.length && selectedValues.map(value => valuesObject.find(v => v.item_id === value))[0]

答案 2 :(得分:0)

也许我的设置错误,但看到returnObj是一个数组,filter似乎是一个不错的选择。例如,与Set

结合使用
let set = new Set(valuesObject.map(o=>o.item_id)),
    returnObj = selectedValues.filter(s=>set.has(s));

示例:

&#13;
&#13;
let selectedValues = ['aaa', 'bbb', 'ccc', 'ddd'],
	valuesObject = [ {item_id:'ddd'}, {item_id:'eee'}, {item_id:'bbb'}];


let set = new Set(valuesObject.map(o=>o.item_id)),
	returnObj = selectedValues.filter(s=>set.has(s));

console.log(returnObj);
&#13;
&#13;
&#13;