首页 > 解决方案 > 如何删除数组内数组的索引?

问题描述

我想删除更大数组中的数组中的索引;例如:

 let myArray = [
  [{general : true, name: 'a' },{general : true, name: 'b' },{general : false, name: 'c' }],
  [{general : false, name: 'd' },{general : true, name: 'e' },{general : false, name: 'f'}],
  [{general : true, name: 'i' },{general : false, name: 'h' },{general : false, name: 'g' }]
]

我想删除所有对象general == false来得到这个:

myFilteredArray = [
      [{general : true, name: 'a' },{general : true, name: 'b' }],
      [{general : true, name: 'e' }],
      [{general : true, name: 'i' }]
    ]

我这样做了,但它不起作用:

let l = myArray.length;
      for (let i = 0; i < l; i++) {
        for (let j = 0; j < myArray[i].length; j++) {
          if(!myArray[i][j].general){
            myArray[i].splice(j,1)
          }
        }
      }

提前致谢。

标签: javascriptarrays

解决方案


问题是当您有两个general: false彼此相邻的对象时。您正在查看 index j,并可能删除该条目,然后移至它之后的下一个条目 - 但是当您删除一个条目时,它之后的条目将向上移动到 indexj并且永远不会被检查。

三个选项:

  1. 当您删除条目时,递减,j以便您检查在下一次通过时移动的条目。

  2. 从末端向后循环。

  3. 用于filter创建数组,而不是就地修改数组,可能与map外部数组结合使用:

#2 比 #1 更受欢迎:

let l = myArray.length;
for (let i = 0; i < l; i++) {
    for (let j = myArray[i].length - 1; j >= 0; --j) {
        if (!myArray[i][j].general) {
            myArray[i].splice(j,1)
        }
    }
}

现场示例:

let myArray = [
    [{general : true, name: 'a' },{general : true, name: 'b' },{general : false, name: 'c' }],
    [{general : false, name: 'd' },{general : true, name: 'e' },{general : false, name: 'f'}],
    [{general : true, name: 'i' },{general : false, name: 'h' },{general : false, name: 'g' }]
];

let l = myArray.length;
for (let i = 0; i < l; i++) {
    for (let j = myArray[i].length - 1; j >= 0; --j) {
        if (!myArray[i][j].general) {
            myArray[i].splice(j,1)
        }
    }
}
console.log(myArray);

这是#3:

myArray = myArray.map(subarray => subarray.filter(({general}) => general));

现场示例:

let myArray = [
    [{general : true, name: 'a' },{general : true, name: 'b' },{general : false, name: 'c' }],
    [{general : false, name: 'd' },{general : true, name: 'e' },{general : false, name: 'f'}],
    [{general : true, name: 'i' },{general : false, name: 'h' },{general : false, name: 'g' }]
];

myArray = myArray.map(subarray => subarray.filter(({general}) => general));
console.log(myArray);


推荐阅读