使用键获取对象数组中的对象
Get the object in an array of object with the key
所以我有一个对象数组,我想用键 "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"
}
您可以将其替换为对象,而不是对象数组:
"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
使用 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' }
这条链正在做什么的概述:
- chain():启用显式链接。否则,
find()
将 return 一个未包装的对象,我们还有要执行的操作。
- find():我们传入一个回调来检查
Z
键是否存在。回调本身是使用高阶函数实用程序构造的:
- ary():限制传递给函数的参数数量。我们在这里这样做是因为
find()
将我们不关心的参数传递给我们的回调。
- partialRight():为
has()
函数提供'Z'
参数。这是最右边的参数,这意味着集合中的每个项目都作为 first 参数传递。
- has(): Returns 如果对象上存在
Z
键则为真。
- values():我们不关心对象键,只关心它的值。
- first():
values()
函数 return 是一个集合,但我们只想要其中的第一项。集合中应该只有 一项。
所以我有一个对象数组,我想用键 "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"
}
您可以将其替换为对象,而不是对象数组:
"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
使用 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' }
这条链正在做什么的概述:
- chain():启用显式链接。否则,
find()
将 return 一个未包装的对象,我们还有要执行的操作。 - find():我们传入一个回调来检查
Z
键是否存在。回调本身是使用高阶函数实用程序构造的:- ary():限制传递给函数的参数数量。我们在这里这样做是因为
find()
将我们不关心的参数传递给我们的回调。 - partialRight():为
has()
函数提供'Z'
参数。这是最右边的参数,这意味着集合中的每个项目都作为 first 参数传递。 - has(): Returns 如果对象上存在
Z
键则为真。
- ary():限制传递给函数的参数数量。我们在这里这样做是因为
- values():我们不关心对象键,只关心它的值。
- first():
values()
函数 return 是一个集合,但我们只想要其中的第一项。集合中应该只有 一项。