在链中按键查找数组元素
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' ]
在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' ] }
如果这是真的,那么只有那个对象会被 returned。由于您只需要值,我们在其上调用 values
函数。此时,结果会是这样
[ [ '1', '2' ] ]
然后 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;
});
我正在使用下划线链,但卡在了它的最后一位。
我只需要它查看一组对象,然后 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' ]
在
find
function, we returntrue
only if the current object being processed has a property with the name in thestateName
, with the_.has
函数中。此时结果会是这样{ obj1: [ '1', '2' ] }
如果这是真的,那么只有那个对象会被 returned。由于您只需要值,我们在其上调用
values
函数。此时,结果会是这样[ [ '1', '2' ] ]
然后
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;
});