【问题标题】:JavaScript -- how to iterate through an array of objects to create a new object whose key is the value of the original object's initial key/value pairJavaScript——如何遍历对象数组以创建一个新对象,其键是原始对象的初始键/值对的值
【发布时间】:2018-01-27 22:35:23
【问题描述】:

这是我的情况:

我必须实现一个函数“mapById”,当给定一个对象数组时,它返回一个对象,其中键是输入对象的 id,值是相应的输入对象。

var input = [{id: 102, name: "Alice"},
             {id: 205, name: "Bob", title: "Dr."},
             {id: 592, name: "Claire", age: 32}];

console.log(mapById(input));

应该给出以下结果:

102: {id: 102, name: "Alice"},
205: {id: 205, name: "Bob", title: "Dr."},
592: {id: 592, name: "Claire", age: 32}

到目前为止,这是我的功能:

function mapById(list) {
    var obj = {};
    var objectKey = '';
    list.forEach(function(item) {
        objectKey = (Object.values(item)[0]);
        var obj = {[objectKey]: item};
    });
    return obj;
}

我可以为原始数组中的每个对象获取一个新的键/值对,但我不知道如何将每个新的键/值对添加到新对象。

ObjectKey: 102
item: { id: 102, name: 'Alice' }
obj: { '102': { id: 102, name: 'Alice' } }
ObjectKey: 205
item: { id: 205, name: 'Bob', title: 'Dr.' }
obj: { '205': { id: 205, name: 'Bob', title: 'Dr.' } }
ObjectKey: 592
item: { id: 592, name: 'Claire', age: 32 }
obj: { '592': { id: 592, name: 'Claire', age: 32 } }

我该如何解决这个问题?如果这是一个数组,我可以使用“推送”方法。对象有类似的方法吗?我需要关闭吗?我知道这是基本的东西,但我对 javascript 还是很陌生。

谢谢。

【问题讨论】:

  • 为清楚起见编辑了问题

标签: javascript arrays object


【解决方案1】:

其实你们很亲近:

function mapById(list) {
    var obj = {};
    list.forEach(function(item) {
        obj[item.id] = item;
    });
    return obj;
}

我会怎么做:

 const result = Object.assign(...input.map(el => ({[el.id] : el})));

【讨论】:

  • 哇,你的方法对我来说就像黑魔法。你能描述一下它是如何工作的吗?
  • @terales 它将数组映射到类似对象的键值对数组,并通过将这些对象分散到 Object.assign 中来统一这些对象
  • 但是Object.entries返回一个数组,你怎么把它转换成对象呢?
  • @terales 哎哟。应该是Object.assign,对不起。大家晚安:/
  • 哦,谢谢。现在很清楚了。我认为这是一个聪明的把戏,克服它很有趣:)
【解决方案2】:

使用Array.prototype.reduce():

var input = [{id: 102, name: "Alice"},
             {id: 205, name: "Bob", title: "Dr."},
             {id: 592, name: "Claire", age: 32}]
             
var output = input.reduce(function(accumulator, item) {
  accumulator[item.id] = item
  return accumulator
}, {})

console.log(output)
             

【讨论】:

    【解决方案3】:
    var output = input.reduce(function(m,x,i) {
      m[x.id] = x
      return m
    }, {})
    

    reduce 函数允许您在迭代数组时构建单个对象。注意最后一个参数{},它将m 初始化为一个空对象。

    【讨论】:

    • 发布的代码实际上与@terales 答案中的代码相同,但更简洁。这里没有附加价值。
    • 我没有看到任何其他答案!我正在使用该应用程序
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 2017-12-28
    • 2017-08-30
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多