【问题标题】:How to create key value pair from an array?如何从数组创建键值对?
【发布时间】:2020-08-19 20:21:28
【问题描述】:

我有一个包含以下数据的数组对象:

const arr = [
{
  key: 'mykey1597855209',
  integrity: 'sha512-T9JWj=='
},
{
  key: 'mykey159785520915978552101597855212',
  integrity: 'sha512-T9JWj=='
},
{
  key: 'mykey15978552091597855210',
  integrity: 'sha512-lcddfd=='
},
{
  key: 'otherkey15978552091597855210',
  integrity: 'sha512-abcdfd=='
}];

我想从arr[] 对象创建key value 对,这样integrity 成为键,key 成为值

所需的输出如下所示:

{
  "sha512-T9JWj==": [
    "mykey1597855209",
    "mykey159785520915978552101597855212"
  ],
  "sha512-lcddfd==": [
    "mykey15978552091597855210"
  ],
  "sha512-abcdfd==": [
    "otherkey15978552091597855210"
  ]
}

我写了以下代码:

const arr = [{
    key: 'mykey1597855209',
    integrity: 'sha512-T9JWj=='
  },
  {
    key: 'mykey159785520915978552101597855212',
    integrity: 'sha512-T9JWj=='
  },
  {
    key: 'mykey15978552091597855210',
    integrity: 'sha512-lcddfd=='
  },
  {
    key: 'otherkey15978552091597855210',
    integrity: 'sha512-abcdfd=='
  }
];
const result = Object.assign(...arr.map(a => ({
  [a.integrity]: a.key
})));

console.log(result)

【问题讨论】:

  • 使用 reduce 并推送到数组 - 这是无效的 { 'mykey1597855209', 'mykey159785520915978552101597855212' }

标签: javascript node.js arrays dictionary


【解决方案1】:

你可以使用Object.fromEntries:

const arr = [{key: 'mykey1597855209',integrity: 'sha512-T9JWj=='},{key: 'mykey159785520915978552101597855212',integrity: 'sha512-T9JWj=='},{key: 'mykey15978552091597855210',integrity: 'sha512-lcddfd=='},{key: 'otherkey15978552091597855210',integrity: 'sha512-abcdfd=='}];

let map = Object.fromEntries(arr.map(({_, integrity }) => [integrity, []]));
arr.forEach(({key, integrity}) => map[integrity].push(key));

console.log(map);

reduce:

const arr = [{key: 'mykey1597855209',integrity: 'sha512-T9JWj=='},{key: 'mykey159785520915978552101597855212',integrity: 'sha512-T9JWj=='},{key: 'mykey15978552091597855210',integrity: 'sha512-lcddfd=='},{key: 'otherkey15978552091597855210',integrity: 'sha512-abcdfd=='}];

let map = arr.reduce((acc, { key, integrity }) => {
  acc[integrity] = acc[integrity] || [];
  acc[integrity].push(key);
  return acc;
}, {});

console.log(map);

【讨论】:

  • 'sha512-T9JWj==' 有两个键值 'mykey1597855209','mykey159785520915978552101597855212' 但在输出中只显示一个
  • 好吧,你不能复制相同的完整性值,因为它是最终对象的键。你当时是如何想象输出的?请注意,您在问题中列出的所需输出无效。
  • 无论如何,你可以使用子数组。查看我的答案的更新。
  • 谢谢。我也相应地更新了我的问题。
【解决方案2】:

你可以这样变换它:

let map = {};

arr.forEach({ key, integrity } => map[integrity] = key);

【讨论】:

    【解决方案3】:
    arr.reduce((acc, curr) => {    
        acc[curr.integrity] = (acc[curr.integrity]) ? 
                              [ ...acc[curr.integrity], curr.key ] : 
                              [ curr.key ]    
        return acc;
    }, {})
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2013-12-02
      • 1970-01-01
      • 2019-01-01
      • 2016-12-31
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多