在链中按键查找数组元素

时间:2015-03-05 03:02:16

标签: javascript underscore.js

我正在使用下划线链,并且最后一点被困在其中。

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

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”,它将返回我[“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”],就像下面的答案中一样,我觉得我的链接有些不对劲。谢谢!

3 个答案:

答案 0 :(得分:1)

如果您确定只有一场比赛,那么您可以使用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函数中,只有当正在处理的当前对象的true中的名称属性为_.has时,才会返回stateName功能。此时结果将是这样的

    { obj1: [ '1', '2' ] }
    
  2. 如果确实如此,则只返回该对象。由于您只需要值,我们会在其上调用values函数。此时,结果将是这样的

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

    [ '1', '2' ]
    

答案 1 :(得分:1)

您可以使用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) })

答案 2 :(得分:0)

如果您使用过滤器而不是查找该怎么办?

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