用内部对象值交换数组键

问题描述

我有一个保存对象的数组;

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

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

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

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

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

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

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

所以我有这样的事情:

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

解决方法

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

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

我想我更喜欢 reduce 方法,但您也可以构造一个“类数组”(即带有数字键和 object 属性的 length)并将其传递给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"
}]