我正在尝试编写一个查看对象数组(第一个参数)的函数,并返回包含给定对象(第二个参数)的所有键/值对的所有对象的数组。 / 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
答案 0 :(得分:2)
您可以使用一些数组方法,例如Array#map
map()
方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。
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.keys
,Array.forEach
和Array.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}]