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

时间:2015-02-26 20:11:10

标签: javascript node.js lodash

所以我有一个对象数组,我想用关键字" 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"
}

2 个答案:

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

该链正在做什么的概述:

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