簡體   English   中英

JavaScript:將二維數組與 Map 轉換為字典(嵌套對象)

[英]JavaScript: Convert two-dimensional array with Map into Dictionary(nested Object)

我在二維數組中有一組值。 我映射了一個 Object 並制作了一個新數組。 第一個值key是一個字符串,第二個值currentTasks[key]是一個數組,其中每個值都有idtextdate

const newArray = Object.keys(currentTasks).map(function(key){
                return [key, currentTasks[key]];
            });

newArray 有這樣的形式……

['1', {id:'1', text: "Todo item #1", date: '2021-11-30'}]

我想要做的是將 newArray 轉換為 Dictionary 的形式。 我想以 HashMap 形式將第一個值作為鍵,將第二個值作為值。 如何將這種形式的數組轉換為像鍵值對一樣的 hash map?

{
        '1': {id:'1', text: "Todo item #1", date: '2021-11-30'},
        '2': {id:'2', text: "Todo item #2", date: '2021-12-12'},
        '3': {id:'3', text: "Todo item #3", date: '2021-11-29'},
        '4': {id:'4', text: "Todo item #4", date: '2021-12-03'},
}

我想得到一個像這樣的嵌套 object 數組。

 const testValues = [ ['1', {id:'1', text: "Todo item #1", date: '2021-11-30'}], ['2', {id:'2', text: "Todo item #2", date: '2021-12-12'}], ['3', {id:'3', text: "Todo item #3", date: '2021-11-29'}], ['4', {id:'4', text: "Todo item #4", date: '2021-12-03'}] ]; const outputObject = {}; testValues.forEach(x => { outputObject[x[0]] = x[1]; }); console.log(testValues, outputObject);

如果您想簡潔,我相信您正在尋找reduce數組方法。

reduce() 方法按順序對數組的每個元素執行用戶提供的“reducer”回調 function,並傳入前一個元素的計算返回值。 在數組的所有元素上運行 reducer 的最終結果是單個值。

您可以提供一個初始值,在這種情況下,它是一個 object 文字。 然后,您可以在每個子陣列上 map 並提供鍵:值對。

 const array1 = [ ['1', {id:'1', text: "Todo item #1", date: '2021-11-30'}], ['2', {id:'2', text: "Todo item #2", date: '2021-12-12'}], ['3', {id:'3', text: "Todo item #3", date: '2021-11-29'}], ['4', {id:'4', text: "Todo item #4", date: '2021-12-03'}] ]; const reducer = (previousValue, currentValue) => ({...previousValue, [currentValue[0]]: currentValue[1]}); // {1: {…}, 2: {…}, 3: {…}, 4: {…}} console.log(array1.reduce(reducer, {})); // as a one liner // array1.reduce((a, b) => ({...a, [b[0]]: b[1]}), {})

或者您也可以使用Map

Map object 保存鍵值對並記住鍵的原始插入順序。 任何值(對象和原始值)都可以用作鍵或值。

 const array1 = [ ['1', {id:'1', text: "Todo item #1", date: '2021-11-30'}], ['2', {id:'2', text: "Todo item #2", date: '2021-12-12'}], ['3', {id:'3', text: "Todo item #3", date: '2021-11-29'}], ['4', {id:'4', text: "Todo item #4", date: '2021-12-03'}] ]; const newMap = new Map() array1.forEach(el => newMap.set(el[1], el[0])) // 1: {…}, 2: {…}, 3: {…}, 4: {…} newMap.forEach((key, value) => console.log(key, value))

我猜這就是您要找的 output?:

 const values = [ ['1', {id:'1', text: "Todo item #1", date: '2021-11-30'}], ['2', {id:'2', text: "Todo item #2", date: '2021-12-12'}], ['3', {id:'3', text: "Todo item #3", date: '2021-11-29'}], ['4', {id:'4', text: "Todo item #4", date: '2021-12-03'}] ] const obj = {}; values.map(val => obj[val[0]] = val[1]) console.log(obj)

使用Object.fromEntries -

 const input = [ {id:'1', text: "Todo item #1", date: '2021-11-30'}, {id:'2', text: "Todo item #2", date: '2021-12-12'}, {id:'3', text: "Todo item #3", date: '2021-11-29'}, {id:'4', text: "Todo item #4", date: '2021-12-03'}, ] const output = Object.fromEntries(input.map(x => [x.id, x])) console.log(output)

{
  '1': {id:'1', text: "Todo item #1", date: '2021-11-30'},
  '2': {id:'2', text: "Todo item #2", date: '2021-12-12'},
  '3': {id:'3', text: "Todo item #3", date: '2021-11-29'},
  '4': {id:'4', text: "Todo item #4", date: '2021-12-03'},
}

暫無
暫無

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

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