【问题标题】:Swap array keys with inner object value用内部对象值交换数组键
【发布时间】:2021-06-09 10:36:56
【问题描述】:

我有这个存放对象的数组;

let arr = [
    {
        "id": 1,
        "level": "2",
    },
    {
        "id": 2,
        "level": "3",
    }
]

默认情况下,数组的键从 0 开始,如下所示:

[
    0: {id: 1, level:2},
    1: {id: 2, level:3}
]

如何转换它以使键是属性“级别”的值? 它应该是这样的:

[
    2: {id:1, level:2},
    3: {id:1, level:3}
]

到目前为止,我已经尝试过了,但它并没有删除原始密钥:

arr.map((v, k) => ({[v.level]: v}));

所以我有这样的事情:

[
    0: {2:
        {id: 1, level:2}
    },
    1: {3:
        {id: 2, level:3}
    }
]

【问题讨论】:

  • arr.map((v, k) => ({[v.level]: v})); 你的代码应该给出结果
  • @Rajdeep Debnath 它没有。
  • 你期望的结果是不可能的,你需要一个对象,而不是一个数组。 { 2: { id: 1, level: 2 }, 3: {id: 2, level: 3 } }
  • @Petyor 把它放在问题中的 sn-p 中,你会看到你的预期结果。

标签: javascript arrays ecmascript-6 javascript-objects


【解决方案1】:

您需要使用 reduce 填充一个新数组:

arr.reduce((prev, curr) => { prev[curr.level] = curr; return prev }, [])

【讨论】:

    【解决方案2】:

    我想我更喜欢reduce 方法,但您也可以构造一个“类数组”(即带有数字键和length 属性的object)并将其传递给Array.from

    const maxIdx = Math.max(...arr.map(v => parseInt(v.level, 10)))
    const arrLen = maxIdx + 1;
    const arrayLike = { 
        ...Object.fromEntries(arr.map(v => [v.level, v])), 
        length: arrLen
    };
    const mappedArray = Array.from(arrayLike);
    

    对于输出

    [undefined, undefined, {
      "id": 1,
      "level": "2"
    }, {
      "id": 2,
      "level": "3"
    }] 
    

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2021-05-17
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多