Lodash findWhere 以对象作为键的值

Lodash findWhere with Object as value of key

我有一个对象列表,我正在尝试使用下划线 findwhere 函数在列表中查找一个对象,其中包含一个键和另一个对象作为其值。我试过这样做但得到了一个未定义的值。所以我的问题是下划线 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) 应该 return {channel: {aa: "1", bb: "2"}, id: 233332} 它为这个对象数组做的有两个键但有更多填充的对象,即具有更多键和值的对象似乎不起作用,findWhere 是否有任何陷阱或我没有考虑的任何事情?

.findWhere 方法匹配对象 b 的所有属性。如果添加额外的属性,匹配将失败。但是,您可以执行以下操作:

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

_.pick 将创建一个新对象,其中只有数组 a 中也可用的那些 key/value 对。

_.findWhere 已在 lodash v4.0.0 中弃用,因此最好将 _.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