编写一个函数,它接受一个对象数组和一个具有属性和对象的对象。值

时间:2016-09-01 23:37:38

标签: javascript jquery

编写一个函数,该函数接受一个对象数组和一个具有属性和值的对象。该函数将返回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;
}

2 个答案:

答案 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接受一个检索数组项目的回调,并返回truefalse。如果数组中的每个项都导致函数返回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;
}