将数组转换为对象,通过合并相同键下的值。

3

我尝试查找以前的问题,但没有找到答案,所以这是一个非常通用的问题。

我有一个多维数组,如下所示:

array = [
    [ "1", "2013-14" , 1234],​​
    [ "2", "2013-14", 2345],
    [ "1", "2014-15" , 5234],​​
    [ "2", "2014-15", 7345],
]

我正在尝试根据年份将其转换为嵌套对象:
obj = {
  "2013-14": { 1: "1234", 2: "2345" },
  "2014-15": { 2: "5234", 2: "7345" }
}

我尝试了这个方法,它提供了一个类似但错误的解决方案:

let obj = {}
for (let i = 0; i < array.length; i++) {
  obj[array[i][1]] = {
    [array[i][0]]: array[i][2]
  }
}

我得到的解决方案:

obj = {
      "2013-14": { 2: "2345" },
      "2014-15": { 2: "7345" }
}

因此,与其将不同的值按照相同的键连接在一起,即在这种情况下是年份,它会覆盖之前的值并保存最后一个。
4个回答

3

你需要尊重每个日期的对象。

const
    array = [["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345]],
    obj = {};
    
for (let i = 0; i < array.length; i++) {
    obj[array[i][1]] ??= {};
    obj[array[i][1]][array[i][0]] = array[i][2];
}

console.log(obj);

使用解构的缩短方法

const
    array = [["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345]],
    obj = {};
    
for (const [inner, outer, value] of array) {
    obj[outer] ??= {};
    obj[outer][inner] = value;
}

console.log(obj);


1
我认为问题出在您试图访问刚初始化的键内部的对象上。代码写入了所需的数据,但由于多次访问同一键,数据被覆盖了。
我尝试了以下方法(在Python中),它起作用了:
data = [
[ "1", "2013-14" , 1234],
[ "2", "2013-14", 2345],
[ "1", "2014-15" , 5234],
[ "2", "2014-15", 7345],
]

# EXTRACT KEYS TO INITIALIZE OBJECT AND INSERT VALUES LATER
keys=[]
for i in data :
    if i[1] not in keys:
        keys.append(i[1]) 
parsed_obj = {k:{} for k in keys}

for i in data :
    parsed_obj[i[1]][i[0]] = i[2]
print(parsed_obj)

输出:
{'2013-14': {'1': 1234, '2': 2345}, '2014-15': {'1': 5234, '2': 7345}}

我知道这不是最理想的,但也许有人可以帮你将其翻译成JS。


1
你可以使用扩展运算符 {...} 来连接它。
下面是代码:

var array = [
  ["1", "2013-14", 1234],
  ["2", "2013-14", 2345],
  ["1", "2014-15", 5234],
  ["2", "2014-15", 7345],
];

let obj = {};
for (let i = 0; i < array.length; i++) {
  obj[array[i][1]] = { ...obj[array[i][1]], [array[i][0]]: array[i][2] };
}

console.log(obj);


1

const array = [["1", "2013-14", 1234], ["2", "2013-14", 2345], ["1", "2014-15", 5234], ["2", "2014-15", 7345]];
var result = {}
array.forEach(([i,date,num]) => {
    result[date] ??= {};
    result[date][i] = num;
});
console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接