使用自动索引在循环中创建多维数组
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)
【讨论】:
感谢您的回答。我会将其保存以用于其他项目。以上是关于使用自动索引在循环中创建多维数组的主要内容,如果未能解决你的问题,请参考以下文章