我有代码可以创建第二个数组,其中键作为数据id。
let array = [
{id: 1, name: 'name 1'},
{id: 2, name: 'name 2'},
{id: 35, name: 'name 35'}
]
let newArray = []
array.forEach(function(data){
newArray[data.id] = data
})
我的代码运行良好。我得到了我想要的。
阵列:
0: {id: 1, name: "name 1"}
1: {id: 2, name: "name 2"}
2: {id: 35, name: "name 35"}
newArray:
1: {id: 1, name: "name 1"}
2: {id: 2, name: "name 2"}
35: {id: 35, name: "name 35"}
但是,有比使用循环更好的方法吗?
您的代码可能会做您想做的事情,但概念不正确。newArray
是一个数组,您将数组的元素设置为索引1
、2
和35
,从而生成一个长度为36的数组,其中包含许多未定义的元素:
console.log(newArray);
// results in
[undefined, {
id: 1,
name: "name 1"
}, {
id: 2,
name: "name 2"
}, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, {
id: 35,
name: "name 35"
}]
使用像forEach
或map
这样的数组函数只会遍历您设置的三个元素,但for (let i = 0; i < newArray.length; i++)
循环会导致意外的结果。
如果您想通过某个id对数组进行索引,那么您将需要一个映射(Typescript中的Record<number, any>
(,在Javascript的情况下,它只是一个对象。在不更改大部分代码的情况下,您只需使用const newArray = {}
即可。
如果不使用循环,如您所愿,array.reduce函数就是您想要的:
const indexed = array.reduce(
(result, current) => ({
...result, // spread current result
[current.id]: current // add the current element at current.id
}),
{}); // initialize with an empty object
当然,您不能像使用数组那样迭代对象,但可以使用for ... in
和for ... of
循环:
for (let index in indexed) {
console.log(indexed[index])
}
for (let element of indexed) {
console.log(element)
}
循环是编程的主要元素之一,它们快速(对于循环(且易于使用,没有理由不想使用它们。特别是若要变换数组,必须循环遍历每个元素。
但是总有一种方法可以改变你的程序逻辑。你可以将数据组织在对象中,以便稍后通过它们的ID访问它们,如
// Object data
const data = {
1: { name: "name 1" },
2: { name: "name 2" },
35: { name: "name 35" }
};
// Access entries
console.log(data[35].name);