JS-按属性值的数组过滤对象数组,并返回已过滤对象的数组

人气:560 发布:2022-10-16 标签: arrays filter javascript-objects find

问题描述

我正在尝试(在js或jQuery中)筛选对象数组并返回具有特定属性名称的对象数组。

我尝试了filterfind函数,如下所示:

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}]
var vals = [1, 2]

  function callback(obj) {
        var arr = arr || []
        console.log(arr)
        $.each(vals, function(key, val) {
            if ( val == obj.a ) {
                arr.push(obj)
            }
        })
    }

    var result = objs.find(callback);

    console.log(">>>", result)

预期结果为:

result = [{a:1}, {a:2}]

但是,它不起作用,因为find的每个迭代都会重新开始,并重新定义arr

当然,我可以使用两个嵌套的$.each()进行迭代-一个用于迭代对象数组,另一个用于迭代属性值数组,但我认为这是最后的选择--寻找更优雅、更简短的对象。你们有什么主意吗?

推荐答案

Thijs的答案有效,但随着vals数组变大,它的性能将变得不佳。要获得O(N)复杂性,您可以从allowedValues数组中构建一个集合:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}]
var vals = [1, 2]

function filterByValue(source, allowedValues) {

    allowedValues = new Set(allowedValues)
    // Return the result of the filter.

    return source.filter(item => {
    // Returns true when `a` is present in vals, otherwise it returns false.
       return allowedValues.has(item.a);
    });
}
const filteredArray = filterByValue(objs, vals);

console.log(filteredArray)

509