Sou*_*Ray 5 javascript arrays multidimensional-array
我有一个如下所示的对象
const tableData = [
{
"Location": "London",
"Status": "Unknown"
},
{
"Location": "Delhi",
"Status": "Reachable"
},
{
"Location": "Berlin",
"Status": "Unknown"
},
{
"Location": "Tokyo",
"Status": "Busy"
},
]
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个二维数组,它将以某种方式保存这些信息。下面是我的代码
const statusOrder = {"Reachable": 0, "Busy": 1, "Unknown": 2}
let statusOrderInfo = Array(Object.keys(statusOrder).length).fill([]);
for(let i=0; i< tableData.length; i++) {
const status = tableData[i]["Status"].trim()
const statusIndex = statusOrder[status]
statusOrderInfo[statusIndex].push(tableData[i])
}
console.log(statusOrderInfo)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我希望对象的每个项目都tableData位于二维数组的某个索引中。Status因此,包含as 的项目应位于索引 0 处,包含as 的Reachable项目应位于索引 1 处,依此类推。StatusBusy
所以最终的输出应该是这样的
[
[
{
"Location":"Delhi",
"Status":"Reachable"
}
],
[
{
"Location":"Tokyo",
"Status":"Busy"
}
],
[
{
"Location":"London",
"Status":"Unknown"
},
{
"Location":"Berlin",
"Status":"Unknown"
}
]
]
Run Code Online (Sandbox Code Playgroud)
但即使我的目标是正确的索引,运行上述代码时我也会得到错误的输出。我的方法有什么问题吗?
解决您的问题的简单方法是,只需更改设置初始值statusOrderInfo并使用的方式,Array.from而不是像Array.fill这样:
let statusOrderInfo = Array.from({length: Object.keys(statusOrder).length}, ()=> []);
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是通过空数组设置初始值statusOrderInfo,然后在 for 循环中,根据status值获取当前对象的索引后,可以检查是否 statusIndex已存在statusOrderInfo,如下所示:
const statusOrder = {"Reachable": 0, "Busy": 1, "Unknown": 2}
let statusOrderInfo = [];
for(let i=0; i< tableData.length; i++) {
const status = tableData[i]["Status"].trim()
const statusIndex = statusOrder[status];
if(statusOrderInfo[statusIndex]) statusOrderInfo[statusIndex].push(tableData[i]);
else statusOrderInfo[statusIndex] = [ tableData[i] ]
}
console.log(statusOrderInfo);
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是在数组上使用reduce方法,如下所示:
let statusOrderInfo = Array.from({length: Object.keys(statusOrder).length}, ()=> []);
Run Code Online (Sandbox Code Playgroud)