使用自动索引在循环中创建多维数组

Posted

技术标签:

【中文标题】使用自动索引在循环中创建多维数组【英文标题】:Create multidimensional array in a loop with auto index 【发布时间】:2020-09-07 20:43:52 【问题描述】:

我想在 jQuery/JS 中使用循环创建一个多维数组。是否可以使用下一个可用的密钥而不是手动设置?

jsonFromphp 包含如下内容:

0 first_name: "Tom", last_name: "Smith", location: "London"
1 first_name: "Max", last_name: "Muster", location: "Zurich"
2 first_name: "Joanne", last_name: "Kate", location: "London"
...

这是循环:

jsonFromPhp.forEach((row, i) => 
    if (row['location'] == 'London') 
        firstKey = 0;
     else 
        firstKey = 1;
    

    row.forEach((singleData, n) => 
        pushedArray[firstKey][] = singleData[n]; // doesn't work, I have set the index manually (with i for example). But then I have an array like 0, 2, 5 etc. and I need 0, 1, 2
    );
);

Expected Result:
0 Array (1)
    0 ["Tom", "Smith", "London"] (3)
    1 ["Joanne", "Kate", "London"] (3)
    ...
1 Array (1)
    0 ["Max", "Muster", "Zurich"] (3)
    ...

而不是(如果我设置 pushArray[firstKey][i]

0 Array (1)
    0 ["Tom", "Smith", "London"] (3)
    2 ["Joanne", "Kate", "London"] (3)
    ...
1 Array (1)
    1 ["Max", "Muster", "Zurich"] (3)
    ...

0 Array (1)
    0 ["Tom", "Smith", "London", "Joanne", "Kate", "London"] (6)
1 Array (1)
    1 ["Max", "Muster", "Zurich"] (3)
    ...

【问题讨论】:

(row['location'] == 'london' 区分大小写,您的值为London @freedomn-m 感谢您的提示,更新了代码。这只是我的代码的较短版本,所以如果仍有输入错误,我很抱歉:)。 使用下一个可用的密钥这就是 .push() 所做的 - pushedArray[i].push(singleData[n]) @freedomn-m 但这会将所有行插入一个。看看预期的输出和我不期望/不需要的。 :) 基本上我需要一个头数组和一个包含所有值的行数组。 我明白你所说的“将所有行插入一个”是什么意思,只需一个简单的 .push:jsfiddle.net/5ezL10y9/1 - 需要先创建子数组,然后再推送到该子数组(第二维),而不是第一维 【参考方案1】:

使用下一个可用的键

要自动生成数组索引,最简单的方法是使用

arr.push(value)

这和

一样
arr[arr.length] = value

这个问题的问题是多维数组,以确保您“推”到正确的维度。

在这种情况下,第一个维度(“伦敦”)总是 2 长,因此我们可以通过预先创建数组来简化这一点:

var arr = [[],[]];

创建一个包含 2 个条目的数组,这两个条目本身都是空数组(二维)。

然后代码确定是使用 0 还是 1,这很好 - 下一个维度是源中的每一行/对象,其下是数据所在的位置,给出:

var source = [
first_name: "Tom", last_name: "Smith", location: "London",
first_name: "Max", last_name: "Muster", location: "Zurich",
first_name: "Joanne", last_name: "Kate", location: "London"
];

// create 1st dimension (arr[0], arr[1]) initially
var arr=[[],[]];

// loop through each source row
source.forEach((row, i) => 
    if (row['location'] == 'London') 
        firstKey = 0;
     else 
        firstKey = 1;
    
    
    // add a subdimension for this row
    var rowArr = [];
    for(var k in row)
    
        // add the properties into the subdimension
        rowArr.push(row[k]); 
    
    
    // add the object->array into the 0/1 top-level array
    // using "the next available index"
    arr[firstKey].push(rowArr);
        
);
console.log(arr);

这可以或当然可以大大减少(例如使用.map?: 定位),但这会保持最接近您的原始代码,只更改与问题相关的部分。


使用.forEach减少代码

使用object to array 和预先创建基本数组的相同原理,您可以使用?: 来减少位置索引:

firstKey = row['location'] == 'London' ? 0 : 1

我们可以将您的代码简化为单行代码(为清楚起见进行拆分):

var source = [
first_name: "Tom", last_name: "Smith", location: "London",
first_name: "Max", last_name: "Muster", location: "Zurich",
first_name: "Joanne", last_name: "Kate", location: "London"
];

var arr = [[],[]];

source.forEach((row) => 
    arr[row['location'] == 'London' ? 0 : 1].push(
        Object.keys(row).map(
            (key) => row[key]
        )
    )
);

console.log(arr)

【讨论】:

【参考方案2】:

此解决方案适用于 2 个以上的位置,并且无需关心来自后端的 location 的值。

const arr = [
  first_name: "Tom",
  last_name: "Smith",
  location: "London"
, 
  first_name: "Max",
  last_name: "Muster",
  location: "Zurich"
, 
  first_name: "Joanne",
  last_name: "Kate",
  location: "London"
]
const result = ;

arr.map(item => 
  result[item.location] = [];
  return item;
).map(item => 
  result[item.location].push(Object.values(item));
);

let res2 = [];
Object.keys(result).forEach((key, index) => 
  res2[index] = result[key]
);
console.log(res2)

【讨论】:

感谢您的回答。我会将其保存以用于其他项目。

以上是关于使用自动索引在循环中创建多维数组的主要内容,如果未能解决你的问题,请参考以下文章

在循环内将数组添加到多维数组

使用 for 循环创建多维数组

在循环中创建多维数组

Matlab的多维数组操作

如何从 C# 中的嵌套循环写入多维数组?

jQuery 创建多维数组