【问题标题】:JavaScript: Convert two-dimensional array with Map into Dictionary(nested Object)JavaScript:将二维数组与 Map 转换为字典(嵌套对象)
【发布时间】:2026-01-03 11:15:01
【问题描述】:

我在一个二维数组中有一组值。我映射了一个对象并创建了一个新数组。 第一个值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转换成字典的形式。我想以 HashMap 形式将第一个值作为键,将第二个值作为值。如何将这种形式的数组转换为键值对之类的哈希映射?

{
        '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'},
}

我想得到一个这样的嵌套对象数组。

【问题讨论】:

  • 你的currentTasks 怎么样?
  • 听起来你可能想要Object.fromEntries(),但对我来说这似乎最终会再次创建currentTasks
  • 顺便说一句,你的原始地图和Object.entries() 一样。

标签: javascript arrays object


【解决方案1】:

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);

【讨论】:

  • 你不能用outputObject = Object.fromEntries(testValues)替换整个循环吗?
【解决方案2】:

如果您为了简洁,我相信您正在寻找reduce 数组方法。

reduce() 方法按顺序对数组的每个元素执行用户提供的“reducer”回调函数,传入前一个元素的计算返回值。在数组的所有元素上运行 reducer 的最终结果是单个值。

您可以提供一个初始值,在这种情况下,它是一个对象字面量。然后,您可以映射每个子数组并提供键:值对。

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 对象保存键值对并记住键的原始插入顺序。任何值(对象和原始值)都可以用作键或值。

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))

【讨论】:

    【解决方案3】:

    我猜这就是你要找的输出?:

    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)

    【讨论】:

      【解决方案4】:

      使用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'},
      }
      

      【讨论】: