编写一个函数,该函数接受一个对象数组和一个具有属性和值的对象。该函数将返回prop / val匹配的对象数组。
我知道以下内容,但在理解问题本身时遇到了很多麻烦。任何帮助表示赞赏!
示例返回将是:
thinglist = [
{age: 'four', type: 'Cat', name: 'mammal'},
{age: 'six', type: 'Dog', name: 'mammal'},
{age: 'seven', type: 'Dog', name: 'mammal'},
{age: 'two', type: 'Lizard', name: 'reptile'}
]
withVals( thingList , {type: 'Dog', name: 'mammal'} )
=> [
{age: 'seven', type: 'Dog', name: 'mammal'},
{age: 'six', type: 'Dog', name: 'mammal'}
]
我知道如何迭代数组并提取值,但我不知道如何将对象传递给函数。然后迭代它以查看这些值是否匹配。
这就是我开始的方式:
function withPropValues(arr, obj) {
var newArray = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] === obj) {
newArray.push(arr[i])
}
}
return newArray;
}
答案 0 :(得分:2)
您需要遍历object
的所有属性,并查看它们是否与array
中每个项目的同名属性相匹配。您可以使用Object.keys(object)
获取所有属性名称,并从那里使用括号表示法访问值,例如object[key] === array[i][key]
。
一般来说,您尝试做的事情可以通过filter
非常巧妙地完成,并且您可以将所有属性与every
匹配Object.keys
:
function withVals(array, object) {
var keys = Object.keys(object);
return array.filter(function(item) {
return keys.every(function(k) { return item[k] === object[k]; });
});
}
filter
接受一个回调,该回调检查数组中的项目,如果项目应该保留,则返回true
,如果不保留,则返回false
。它返回一个新的过滤数组。
every
接受一个检索数组项目的回调,并返回true
或false
。如果数组中的每个项都导致函数返回true
,则every
调用也会返回true
,但单个false
值会使其返回false
}。
Object.keys(object).every
正在测试object
的每个键的值是否与array
的某个项目中的相应属性值相匹配。如果是这样,请将该项包含在数组的过滤版本中。
答案 1 :(得分:0)
var thingList = [
{age: 'four', type: 'Cat', name: 'mammal'},
{age: 'six', type: 'Dog', name: 'mammal'},
{age: 'seven', type: 'Dog', name: 'mammal'},
{age: 'two', type: 'Lizard', name: 'reptile'}
];
withPropValues(thingList, {type: 'Cat', name: 'mammal'})
function withPropValues(arr, obj)
{
var newArray = [],
sum = 0;
for(var c in obj)
{
sum++;
}
for (var i = 0; i < arr.length; i++)
{
var match=0;
for(var prop in arr[i])
{
for(c in obj)
{
if(obj[c] == arr[i][prop])
{
match++;
break;
}
}
if(match == sum)
{
newArray.push(arr[i]);
break;
}
}
}
return newArray;
}