簡體   English   中英

將對象數組減少為鍵值 map

[英]Reducing an array of objects to key value map

我有一個對象數組。 我需要制作一個 object 以便我可以根據 id 獲取名稱。

const drinks = [
  { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
];

我試過這個幾乎可以工作:

console.log(drinks.reduce(
  (accumulator, currentValue) => 
     Object.assign(accumulator, accumulator[currentValue._id] = currentValue.name), {}));

但是它輸出:

Object { 
  0: "F", 1: "l", 2: "a", 3: "t", 4: " ", 5: "W", 6: "h", 7: "i", 8: "t", 9: "e",
  5fe40ad4d2e6e6de85c46a6c: "Americano", 
  5fe40ad4d2e6e6de85c46a6d: "Latte", 
  5fe40ad4d2e6e6de85c46a6e: "Flat White" 
}

我需要:

Object { 
  5fe40ad4d2e6e6de85c46a6c: "Americano", 
  5fe40ad4d2e6e6de85c46a6d: "Latte", 
  5fe40ad4d2e6e6de85c46a6e: "Flat White"
}

為什么我的 function 也將其中一個值分解為字符?

 const drinks = [{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }]; const result=drinks.reduce((acc,curr)=>{ acc[curr._id]=curr.name; return acc; },{}) console.log(result)

您可以將您的數組 map 放入一個條目數組(鍵/值對)中,然后您可以通過Object.fromEntries()運行以創建最終的 object

 const drinks = [ { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 } ] const result = Object.fromEntries(drinks.map(({ _id, name }) => [ _id, name ])) console.log(result)

較長的版本將是這樣的

const result = drinks.reduce((obj, { _id, name }) => ({
  ...obj, // spread syntax is like `Object.assign()`
  [ _id ]: name // use `_id` as a dynamic object key with value `name`
}), {})

您當前代碼的問題是......

accumulator[currentValue._id] = currentValue.name

是分配的值(即currentValue.name )。 當用作Object.assign()中的參數時,它被分解為 object 條目,從而產生您所看到的

{ 
  0: "F", 
  1: "l", 
  2: "a", 
  3: "t", 
  4: " ", 
  5: "W", 
  6: "h", 
  7: "i", 
  8: "t", 
  9: "e"
}

只需通過 object { [currentValue._id]: currentValue.name }assign而不是賦值accumulator[currentValue._id] = currentValue.name

 const drinks = [ { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 }, { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 } ]; console.log(drinks.reduce( (accumulator, currentValue) => Object.assign(accumulator, { [currentValue._id]: currentValue.name }), {}));

這將起作用

drinks.map(({ _id, name }) => ({
  [_id]: name
}))

暫無
暫無

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

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