给定一个数组和单元格索引,删除所有给定的单元格索引。
输入:
[[0,1,2,3,4,5],
[0,1,2,3,4,5],
[0,1,2,3,4,5]
]
单元格:
(0,1) (1,1),(2,4),(0,2)
预期输出:
[[0,3,4,5],
[0,2,3,4,5],
[0,1,2,3,5]
]
当我试图删除时,原来的数组正在改变,所以我无法删除适当的索引。在一切都被移除之前,我们不应该改变数组。
obj[key].forEach(element => {
arr[element].splice(key, 1)
});
发布于 2019-03-12 06:00:09
这不是最有效的解决方案,但这里有一个使用reduce
和map
的快速而糟糕的解决方案
const input = [
[0,1,2,3,4,5],
[0,1,2,3,4,5],
[0,1,2,3,4,5]
];
const removals = [[0,1], [1,1], [2,4], [0,2]];
const _ = {};
const output = removals
.reduce((a, [x, y]) => (a[x][y] = _, a), input)
.map(r => r.filter(c => c !== _));
output.forEach(r => console.log(...r));
通过在一次扫描中用占位符(_
)标记要删除的单元格,然后在另一次扫描中返回以删除所有标记的单元格,我可以解决移动索引的问题。
另一种解决方案是在循环遍历索引之前对要删除的索引执行sort
操作,然后可以像往常一样对项执行splice
操作。
const input = [
[0,1,2,3,4,5],
[0,1,2,3,4,5],
[0,1,2,3,4,5]
];
const removals = [[0,1], [1,1], [2,4], [0,2]];
const output = removals
.sort(([a, b], [c, d]) => d - b)
.reduce((a, [x, y]) => (a[x].splice(y, 1), a), input);
output.forEach(r => console.log(...r));
发布于 2019-03-12 06:08:54
您可以按第二个索引降序对索引进行排序,因为splice
会更改索引。
var array = [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]],
remove = [[0, 1], [1, 1], [2, 4], [0, 2]];
remove
.sort((a, b) => b[1] - a[1])
.forEach(([i, j]) => array[i].splice(j, 1));
array.map(a => console.log(...a));
发布于 2019-03-12 06:23:51
有点不同的方法。
let cellsToRemove = [
[1, 2], //(0,1) + (0,2)
[1], //(1,1)
[4], //(2,4)
];
let arr = [
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]
];
let newArr = [];
for (i = 0; i < arr.length; i++) {
newArr.push(arr[i].filter((item) => {
return !cellsToRemove[i].includes(item)
}));
}
console.log(newArr);
我认为Terry的解决方案是最好的。
https://stackoverflow.com/questions/55110757
复制相似问题