为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2022-12-29 09:50:13
我有创建第二个数组的代码,其中键作为数据 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"}新数组:1: {id: 1, name: "name 1"}2: {id: 2, name: "name 2"}35: {id: 35, name: "name 35"}但是有没有比使用循环更好的方法呢?
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您的代码可能会执行您想要的操作,但概念不正确。newArray是一个数组,您将数组的元素设置为 indexes 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"

}]

使用forEachor之类的数组函数map只会遍历您设置的三个元素,但for (let i = 0; i < newArray.length; i++)循环会导致意外结果。


如果你想通过一些 id 索引一个数组,那么你将需要一个映射(Record<number, any>在 Typescript 中),在 Javascript 的情况下它只是一个对象。无需更改大部分代码,您只需使用let 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)

}


查看完整回答
反对 回复 2022-12-29
?
GCT1015

TA贡献1827条经验 获得超4个赞

循环是编程的主要元素之一,它们速度快(for 循环)且易于使用,您没有理由不想使用它们。特别是如果你想转换数组,你必须遍历每个元素。


但是总有办法改变你的程序逻辑。您可以将数据组织在对象中,以便稍后通过它们的 ID 访问它们,就像这样


// Object data

const data = {

  1: { name: "name 1" },

  2: { name: "name 2" },

  35: { name: "name 35" }

};


// Access entries

console.log(data[35].name);


查看完整回答
反对 回复 2022-12-29
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信