如何在javascript中将元素插入到二维数组的特定索引中?

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)

但即使我的目标是正确的索引,运行上述代码时我也会得到错误的输出。我的方法有什么问题吗?

Sae*_*loo 1

解决您的问题的简单方法是,只需更改设置初始值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)