【问题标题】:Convert an array of keys into an object of key-value pairs将键数组转换为键值对对象
【发布时间】:2019-11-25 19:18:10
【问题描述】:

我知道如何转换:

const keys = [1, 2, 3];

到这里:

[{key: 1, val: "q"}, {key: 2, val: "w"}, {key: 3, val: "e"}]

使用单个映射语句:

keys.map((x, i) => ({key: x, val: "qwe".charAt(i)}));

但我其实很想得到这个:

{1: "q", 2: "w", 3: "e"}

有没有一种简洁的方法可以在与上述类似的单个语句中执行此操作?

【问题讨论】:

  • [1, 2, 3].reduce((p, c, i) => (p[c] = "qwe"[i], p), {});,替代:Object.fromEntries([1, 2, 3].map((e, i) => [e, "qwe"[i]]));
  • @ASDFGerte:嗯……这比我刚刚发现的那个还要整洁。谢谢!!!
  • @ASDFGerte:指的是您的第一个(原始)建议。
  • 是的,只是写一些想到的方法。你已经展示了Object.assign,所以我认为我们得到了所有常见的方法。不知道有没有一些不可行但有趣的方法。

标签: javascript node.js javascript-objects


【解决方案1】:

你可以使用reduce:

keys.reduce((accumulator, value, index) => { accumulator[index] = "qwe".charAt(index); return accumulator; }, {})

【讨论】:

  • var a = (b) => b = 10 所以a(5) 返回 10
  • 如果有人注意到您的代码不起作用,您至少可以通过测试来检查它,因为您会发现它实际上并没有。而不是问对任何人都没有好处的东西。
  • 我真的没有测试过,但是你的评论不是不工作的原因。我只是给你解释一下。我是用手机写的,所以无法测试
  • 分配产生右侧值,在您的情况下是一个字符(字符串),并且会完全搞乱reduce 的下一步。如前所述,您需要返回实际对象,如我的评论中所示,以及另一个答案。
【解决方案2】:

啊,明白了:

const objects = Object.assign({}, ...keys.map((x, i) => ({[x]: "qwe".charAt(i)})));

虽然我很乐意听到其他建议以及对此的任何注释...

【讨论】:

    【解决方案3】:

    您可以使用 reduce 和空对象作为累加器的初始值,并在其上插入属性-值对:

    const keys = [1, 2, 3];
    
    let result = keys.reduce((obj, key, idx) => { obj[key] = 'qwe'[idx]; return obj }, {});
    
    console.log(result)

    【讨论】:

      【解决方案4】:

      这是我的解决方案。

      const keys = [1, 2, 3];
      const vals = "qwe";
      const result = keys.reduce((prev, cur, idx) => ({
          ...prev,
          [cur]: vals[idx]
      }), {});

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 2017-08-25
        • 2018-05-10
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多