我有两个数组,如下所示:
array1: [c,d,e]
array2: [[a,b,c,d,e], [1,2,3,4,5], [6,7,8,9,10]]
我已经输入了[c,d,e]。
我要实现的是删除array2中所有对应的索引元素,如下所示,并仅保留具有与[a,b](在这种情况下为0和1)和[c,d,e]对应的索引的元素删除,即[3,4,5]。
因此结果输出应为:
array2: [[a,b], [1,2], [6,7]]
将array2视为一个表,其中第0个元素将始终是标题,并保留所有数据。在这里,array1不必具有连续的元素(如c,d和e),也可以是(c,a,e)。
我正在使用:
x.forEach(elem => {
l.forEach(index => {
elem.splice(l,1);
})
})
但是这种方法的问题在于,每次切出一个元素时,它们的相对位置都会发生变化,从而给出错误的结果。有更好,准确的方法吗?
一种可能的方法:
function stripColumns(rowsWithHeader, columnsToStrip) {
const header = rowsWithHeader[0];
const indexesToStay = header.reduce((acc, col, i) => {
if (!columnsToStrip.includes(col)) acc.push(i);
return acc;
}, []);
return rowsWithHeader.map(row => indexesToStay.map(i => row[i]));
}
const inp = [['a','b','c','d','e'], [1,2,3,4,5], [6,7,8,9,10]];
const res = stripColumns(inp, ['c', 'd', 'e']);
console.log(res);
您可以对此进行一些优化,结合收集索引并填充结果数组的第一行(标题行):
function stripColumns(rowsWithHeader, columnsToStrip) {
const result = [[]], indexesToStay = [];
const header = rowsWithHeader[0];
header.forEach((col, i) => {
if (columnsToStrip.includes(col)) {
return;
}
indexesToStay.push(i);
result[0].push(col);
});
for (let i = 1, len = rowsWithHeader.length; i < len; i++) {
result[i] = indexesToStay.map(j => rowsWithHeader[i][j]);
}
return result;
}
const inp = [['a','b','c','d','e'], [1,2,3,4,5], [6,7,8,9,10]];
const res = stripColumns(inp, ['c', 'e']);
console.log(res);
...但是我不太确定性能的微不足道值得增加复杂性。
请注意,对于这两种方法,原始数组均保持不变。该函数返回一个新值。如果那不是您想要的,是的,您需要以相反的顺序拼接元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句