Javascript-还有什么更好的方法来转换循环



我有代码可以创建第二个数组,其中键作为数据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是一个数组,您将数组的元素设置为索引1235,从而生成一个长度为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"
}]

使用像forEachmap这样的数组函数只会遍历您设置的三个元素,但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 ... infor ... 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);

最新更新