簡體   English   中英

Javascript - 有什么更好的方法來轉換循環?

[英]Javascript - What better way to transform the loop?

我有創建第二個數組的代碼,其中鍵為數據 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"}

但是有沒有比使用循環更好的方法呢?

您的代碼可能會執行您想要的操作,但概念不正確。 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 索引一個數組,那么您將需要一個 map(Typescript 中的Record<number, any> ),如果是 Javascript,它只是一個 ZA8CFDE6331BD59EB2AC96F8911C4B6666Z。 在不更改大部分代碼的情況下,您只需使用let newArray = {}即可。

如您所願,不使用循環, array.reduce function 就是您要尋找的:

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

當然,您不能像使用數組一樣迭代 object,但您可以使用for... infor... of循環:

for (let index in indexed) {
  console.log(indexed[index])
}

for (let element of indexed) {
  console.log(element)
}

循環是編程的主要元素之一,它們速度快(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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM