在JavaScript中从一个对象中搜索键/值对到另一个对象

4

如果我在JavaScript中有一个对象数组和一个对象:

var data = [{"a": 1, "b": 2}, {"a": 1}, {"a": 1, "b": 2, "c": 3}];
var myFilter = {"a": 1, "b": 2};

我想使用myFilter对象作为过滤器来过滤对象数组以创建一个新的对象数组,仅当对象至少匹配或包含myFilter键/值对时才这样做。

有什么建议可以让我把它编写成代码吗?我需要使用myFilter键/值对从data中创建一个新的过滤后的数组。

我能做到这一点,但是myFilter只包含1个键/值对。

我期望得到的新数组是:

var newArr = [];
newArr = [{"a": 1, "b": 2}, {"a": 1, "b": 2, "c": 3}];

如果你为单个配对做了这个,那么为多个配对做起来也不难——你只需要在循环内再套一个循环。对于枚举对象属性,使用for(a in b)结构(其中b是一个对象)。 - weaknespase
@VallyN 我也尝试过这样做,但是很可能会创建当前对象的副本,因为第二个键/值对也匹配。 - arantebw
CodeSir和Andreas都回答了你的问题,看一下。 - weaknespase
3个回答

5
您可以使用 arr.filter(callback[, thisArg]) 来实现此目的:

var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }]
var myFilter = { "a": 1, "b": 2 }

var myFilterFunction = function(obj) {
  for (var p in myFilter) {
    if (obj[p] !== myFilter[p]) return false
  }
  return true
}

var newArr = data.filter(myFilterFunction)

document.write(JSON.stringify(newArr))


更通用的方法是使用 filterFuncByObj(filterObj) 函数,该函数接受任何自定义过滤对象:
使用 data.filter(filterFuncByObj(myFilter)) 进行过滤。

var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }]
var myFilter = { "a": 1, "b": 2 }

var newArr = data.filter(filterFuncByObj(myFilter))

// Demo Output
document.write(JSON.stringify(newArr))


function filterFuncByObj(filterObj) {
  return function(obj) {
    for (var p in filterObj) {
      if (obj[p] !== filterObj[p]) return false
    }
    return true
  }
}


您还可以将过滤器集作为参数传递。 - weaknespase
@VallyN,你是对的,这样会更好。我修改了代码。 - CoderPi
@CodeiSir 这太棒了!谢谢你! - arantebw
@BillyWilsonArante 欢迎您!我还添加了一个更通用的过滤器 filterFuncByObj(filterObj) - CoderPi

3
使用 Array.filter()Object.keys()Array.every() 可以是一种解决方法。

var data = [{"a": 1, "b": 2}, {"a": 1}, {"a": 1, "b": 2, "c": 3}];
var myFilter = {"a": 1, "b": 2};

var filteredData = data.filter(function(d) {
    return Object.keys(myFilter).every(function(f) {
        return d[f] === myFilter[f];
    })
});

console.log(JSON.stringify(filteredData));


1

lodash 的方式,以防万一:

var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }];
var myFilter = { "a": 1, "b": 2 };

var newArr = _.filter(data, myFilter);
document.write(JSON.stringify(newArr, null, 3));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接