Lodash findWhere使用Object作为键的值

时间:2016-03-18 15:20:07

标签: lodash

我有一个对象列表,我正在尝试使用下划线findwhere函数来查找列表中的对象,其中包含一个键,另一个对象作为其值。我试过这样做但得到一个未定义的值。所以我的问题是下划线找到可用于查找具有另一个对象值的键的对象,而不是字符串或数字。示例代码。

var a = [
  {channel: {aa: "1", bb: "2"}, id: 233332},
  {channel: {aa: "3", bb: "4"}, id: 822211}
]

var b = {channel: {aa: "1", bb: "2"}, id: 233332}

_。findWhere(a,b)应该返回{channel:{aa:“1”,bb:“2”},id:233332}它为具有两个键但具有更多填充的对象数组所做的对象,即具有更多键和值似乎不起作用的对象,是否有任何关于findWhere的问题或任何我不考虑的事情?

2 个答案:

答案 0 :(得分:4)

_。在lodash v4.0.0中不推荐使用findWhere,因此最好将_.find与_.matches一起使用。

lodash _.matches

var a = [
  {channel: {aa: "3", bb: "4"}, id: 822211},
  {channel: {aa: "1", bb: "2"}, id: 233332}
];

var b = {channel: {aa: "1", bb: "2"}, id: 233332, desc:"Hello"};
_.find(a, function(n){
    if(_.matches(n)(b)){
       return n;
    }
});

jsFiddle with lodash v3.1.0

现在,如果你想要其他方式

var a = [
  {channel: {aa: "3", bb: "4"}, id: 822211, desc:"Hello"},
  {channel: {aa: "1", bb: "2"}, id: 233332, desc:"Hello"}
];

var b = {channel: {aa: "1", bb: "2"}, id: 233332};
_.find(a, function(n){
    if(_.matches(b)(n)){
       return n;
    }
});

jsFiddle with lodash v3.1.0

答案 1 :(得分:0)

.findWhere方法匹配对象b的所有属性。如果添加额外属性,则匹配将失败。您可以做的是以下内容:

_.findWhere(a, _.pick(b, ['channel', 'id']));

_.pick将创建一个新对象,只有那些在数组中也可用的键/值对。