在链中按键查找数组元素

Find array element by key in a chain

我正在使用下划线链,但卡在了它的最后一位。

我只需要它查看一组对象,然后 return 通过它的键找到正确的对象。这是我的

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"]}]

我只希望它 return 具有存储在正在传递的变量 stateName 中的相同密钥的密钥。因此,如果 stateName 是 "obj1",它会 return 我 ["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,我希望它 return 我 ["1","2"],就像下面的答案一样,我认为我的链接有问题。谢谢!

如果你确定只有一个匹配,那么你可以使用find,因为它会在得到第一个匹配后return。

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 function, we return true only if the current object being processed has a property with the name in the stateName, with the _.has函数中。此时结果会是这样

    { obj1: [ '1', '2' ] }
    
  2. 如果这是真的,那么只有那个对象会被 returned。由于您只需要值,我们在其上调用 values 函数。此时,结果会是这样

    [ [ '1', '2' ] ]
    
  3. 然后 values 实际上 return 是一个值数组。因此,我们用 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(function(v, k) {
    return k === stateName;
});