使用键获取对象数组中的对象

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' }

这条链正在做什么的概述:

  1. chain():启用显式链接。否则,find() 将 return 一个未包装的对象,我们还有要执行的操作。
  2. find():我们传入一个回调来检查 Z 键是否存在。回调本身是使用高阶函数实用程序构造的:
    • ary():限制传递给函数的参数数量。我们在这里这样做是因为 find() 将我们不关心的参数传递给我们的回调。
    • partialRight():为has()函数提供'Z'参数。这是最右边的参数,这意味着集合中的每个项目都作为 first 参数传递。
    • has(): Returns 如果对象上存在 Z 键则为真。
  3. values():我们不关心对象键,只关心它的值。
  4. first(): values() 函数 return 是一个集合,但我们只想要其中的第一项。集合中应该只有 一项。