所以我有一个对象数组,我想用关键字" Z"来获取对象。
显然我可以循环遍历数组并逐个检查每个密钥并抓住匹配的密钥,但我认为可能有比现有方法更好的方法:
for (var i = 0; i < data.length; i++) {
if (Object.keys(data[i]).toString() == "z") {
return data[i].z;
break;
}
}
我的数据:
"data": [
{ "X": { "foo": "bar1" } },
{ "Y": { "foo": "bar2" } },
{ "Z": { "foo": "bar3" } }
]
期望的输出:
{
"foo": "bar3"
}
答案 0 :(得分:2)
您可以将其替换为对象,而不是对象数组:
"data": {
"X": { "foo": "bar1" },
"Y": { "foo": "bar2" },
"Z": { "foo": "bar3" }
}
然后像这样访问你的对象:
data['Z']
你可以看到,更整洁。
我猜你最初使用的数组是为了方便追加等等,但对于一个对象来说也很简单:
data['A'] = { "foo": "bar4" };
将在数据中创建键"A"
,您仍然可以使用for (... in ...)
循环遍历您的对象,即:
for (key in data) {
console.log(data[key].foo);
}
应该打印
bar1
bar2
bar3
bar4
答案 1 :(得分:0)
使用lodash,您可以执行以下操作:
var collection = [
{ X: { foo: 'bar1' } },
{ Y: { foo: 'bar2' } },
{ Z: { foo: 'bar3' } }
];
_(collection)
.chain()
.find(_.ary(_.partialRight(_.has, 'Z'), 1))
.values()
.first()
.value()
// → { foo: 'bar3' }
该链正在做什么的概述:
find()
将返回一个未包装的对象,我们仍然需要执行操作。Z
密钥。回调本身是使用高阶函数实用程序构造的:
find()
传递了我们不关心回调的参数。'Z'
函数提供has()
参数。这是最右边的参数,意味着集合中的每个项都作为第一个参数传递。Z
密钥,则返回true。values()
函数返回一个集合,但我们只想要其中的第一个项目。只有 集合中的一个项目。