检查对象数组中的任何对象是否包含另一个对象中的所有键/值对

时间:2016-06-15 20:33:03

标签: javascript javascript-objects

我正在尝试编写一个查看对象数组(第一个参数)的函数,并返回包含给定对象(第二个参数)的所有键/值对的所有对象的数组。 / p>

下面的代码仅在source对象(第二个参数)包含一个键/值对时才有效。当source对象具有两个或更多键/值对时,结果不符合预期。

如何在source对象中考虑多个键/值对?

function findObjects(collection, source) {
  var result = [];

  for (i=0; i<collection.length; i++) {
    for (var prop in source) {
      if (collection[i].hasOwnProperty(prop) && collection[i][prop] == source[prop]) {
        console.log('Collection\'s object ' + [i] + ' contains the source\'s key:value pair ' + prop + ': ' + source[prop] + '!');
        result.push(collection[i]);
      } else {
        console.log('fail');
      }
    }
  }

  console.log('The resulting array is: ' + result);
  return result;
}

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

// only the first object should be returned since it contains both "a":1 and "b":2

3 个答案:

答案 0 :(得分:2)

您可以使用一些数组方法,例如Array#map

  

map() 方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。

Array#every

  

every() 方法测试数组中的所有元素是否都通过了提供的函数实现的测试。

并首先使用Object.keys获取源代码的属性。

  

Object.keys() 方法返回给定对象自己的可枚举属性的数组,其顺序与for...in循环提供的顺序相同(不同之处在于-in循环也枚举了原型链中的属性。

function findObjects(collection, source) {
    var keys = Object.keys(source);          // get all properties of source
    return collection.filter(function (c) {  // filter collection
        return keys.every(function (k) {     // check every key
            return c[k] === source[k];       // compare value of collection and source
        });
    });
}

console.log(findObjects([{ "a": 1, "b": 2 }, { "a": 1 }, { "b": 2, "c": 2 }], { "a": 1, "b": 2 }));

ES6语法相同(阅读更多:Arrow functions

  

基本上这种风格是

的简短写作
function (x) { return y; }
     

成了

          x =>        y

function findObjects(collection, source) {
    const keys = Object.keys(source);
    return collection.filter(c => keys.every(k => c[k] === source[k]));
}

console.log(findObjects([{ "a": 1, "b": 2 }, { "a": 1 }, { "b": 2, "c": 2 }], { "a": 1, "b": 2 }));

答案 1 :(得分:1)

function findObjects(collection, source) {
    var result = [];

    for (i=0; i<collection.length; i++) {
        var matches = true;
        for (var prop in source) {
            if (!collection[i].hasOwnProperty(prop) || collection[i][prop] !== source[prop]) {
                matches = false;
                break;
            }
        }
        if (matches) {
            result.push(collection[i]);
        }
    }
    return result;
}

基本上,您必须检查所有属性并确保它们匹配,然后只有然后才能将其添加到result数组中。

答案 2 :(得分:1)

使用Object.keysArray.forEachArray.some函数的解决方案:

function findObjects(arr, source) {
    var keys = Object.keys(source), result = [];
    arr.forEach(function(v){
        !keys.some((k) => source[k] !== v[k]) && result.push(v);
    });

    return result;
}

console.log(findObjects([{ "a": 1, "b": 2 }, { "a": 1 }, { "b": 2, "c": 2 }], { "a": 1, "b": 2 }));
// it will output [{"a":1,"b":2}]