按链中的键查找数组元素

Find array element by key in a chain

本文关键字:查找 数组元素      更新时间:2023-09-26

我使用了一个下划线链,并且卡在了它的最后一位。

我只需要它查看一个对象数组,并通过它的键返回正确的对象。这是我的

var item = _.chain(items)
 .findwhere({module: modulename})
 .result('customUrl') 
 //here is where the problem is
 .find(function(v,k){ return k == stateName })
 .value();

所以这个工作直到那个为止。find。在物体的那个点上,find正在寻找这样的东西:

 [{"obj1" : ["1","2"]},{"obj2" : ["3","4"]}]

我只想让它返回一个具有相同密钥的,该密钥存储在正在传递的变量stateName中。因此,如果stateName是"obj1",它将返回me["1","2"]。如果有更好的方法不用下划线,我会洗耳恭听,但我现在一直在使用它。

感谢

编辑:我根据这里的答案做了一个尝试。

需要明确的是,这就是我的数据:

[
 {"module":"module1",
   "customUrl":[{"mod1":["1","2"]},{"mod2":["1","2"]}]
 },
 {"module":"module2",
  "customUrl":[{"mod3":["true","false"]},{"mod4":["5","6"]}]
 }
]

尝试:

 checkitem = _.chain(currentState)
                    .findWhere({module: moduleName})
                    .result('customUrl')
                    .find(function(v){ return v.hasOwnProperty(stateName)})
                    .values()
                    .flatten()
                    .value();

因此,如果var stateName是mod1,我希望它返回我["1","2"],就像下面的答案一样,我认为我的链接有问题。谢谢

如果您确定只有一个匹配,那么您可以使用find,因为它将在获得第一个匹配后返回。

var items = [{
    "obj1": ["1", "2"]
}, {
    "obj2": ["3", "4"]
}, {
    "obj3": ["5", "6"]
}];
var stateName = "obj1";
var item = _.chain(items)
    .find(function(currentObject) {
        return _.has(currentObject, stateName);
    })
    .values()
    .flatten()
    .value();
console.log(item);
# [ '1', '2' ]
  1. find函数中,只有当正在处理的当前对象具有stateName_.has函数中名称的属性时,我们才返回true。在这一点上,结果将是这样的

    { obj1: [ '1', '2' ] }
    
  2. 如果这是真的,那么将只返回该对象。由于您只需要值,我们对其调用values函数。此时,结果将类似于

    [ [ '1', '2' ] ]
    
  3. 然后values实际上返回一个值数组。因此,我们用flatten函数将其压平以获得实际值。在这里,最终结果将是

    [ '1', '2' ]
    

您可以使用in查看属性是否存在(它将成为您的谓词):

var item = _.chain(items)
 .findwhere({module: modulename})
 .result('customUrl')
 .find(function(v){ return stateName in v })
 .value();

或者:

 .find(function(v){ return v.hasOwnProperty(stateName) })

如果使用filter而不是find怎么办?

.filter(function(v, k) {
    return k === stateName;
});