[英]Remove each last element of nested array and complete last array
有一个带有多个数组的数组。 我的目标是用此数据构建一个html表。 因此,每个数组的长度必须相同。
现在,我要删除空行或列:如果每个数组的所有最后一个元素为空(=空字符串)或最后一个数组只有空字符串,则应删除它们。
所以这
var data = [
[ 'field 1', 'field 2', '' ],
[ 'field 1', 'field 2', '' ],
[ 'field 1', 'field 2', '' ],
[ '', '', '' ]
];
应该变成:
var dataNew = [
[ 'field 1', 'field 2' ],
[ 'field 1', 'field 2' ],
[ 'field 1', 'field 2' ]
];
这是我到目前为止所得到的:
data = removeEmpty(data);
function removeEmpty(data) {
// check for empty colomn at the end
var colHasValue = false,
len = data.length;
while (len--) {
if (data[len][data[len].length - 1]) {
unchanged = true;
break;
}
}
if (!colHasValue) {
data = data.map(function (v) {
return v.slice(0, -1);
});
}
// check for empty row at the end
var rowHasValue = false,
lastArray = data[data.length - 1],
len = lastArray.length;
while (len--) {
if (lastArray[len]) {
hasValue = true;
break;
}
}
if (!rowHasValue) {
data.pop();
}
return data;
}
到目前为止,这是可行的。 但是,如果最后有两个空行或列,该怎么办?
例:
var data = [
[ 'field 1', 'field 2', '', '' ],
[ 'field 1', 'field 2', '', '' ],
[ 'field 1', 'field 2', '', '' ],
[ '', '', '', '' ],
[ '', '', '', '' ]
];
应该变成:
var dataNew = [
[ 'field 1', 'field 2' ],
[ 'field 1', 'field 2' ],
[ 'field 1', 'field 2' ]
];
更新:
在这种情况下,不应对数组进行任何操作,因为最后一个col / row并非完全为空:
var data = [
[ 'field 1', 'field 2', '', '' ],
[ 'field 1', 'field 2', '', 'content' ],
[ 'field 1', 'field 2', 'content', '' ],
[ '', '', 'content', '' ],
[ '', 'content', '', '' ]
];
您可以通过将Array.prototype.map()
与Array.prototype.filter()
var dataNew = data.map(function(a){
return a.filter(function(b){
return b.trim().length;
});
}).filter(function(itm){
return itm.length;
});
编辑:
var dataNew = data.filter(function(itm){ return itm.join("").length; }), internalCnt;
for (var i = 0, len = dataNew.length; i < 4; i++) {
for (var j = 0, cnt = 0; j < len; j++){ if(dataNew[j][i] == ""){ cnt++; } }
if(cnt == len) {
internalCnt = 0;
while(internalCnt < len){ dataNew[internalCnt].splice(i,1); internalCnt++; } i--;
}
}
console.log(dataNew);
这是一种实现方法:使用map,我们遍历每个数组,然后过滤掉空字符串,最后过滤掉剩下的空数组。
var data = [
[ 'field 1', 'field 2', '', '' ],
[ 'field 1', 'field 2', '', '' ],
[ 'field 1', 'field 2', '', '' ],
[ '', '', '', '' ],
[ '', '', '', '' ]
];
var newArray = data.map(function(el) {
return el.filter(function(a) {
return a !== '';
});
}).filter(function(el){
return el.length > 0;
});
console.log(newArray);
一个小的枢轴将有助于Array#reduceRight()
进行后退,并使用Array#some()
检查该行是否不完全为空,然后将数据添加到结果数组中。
两次申请正确的方向。
function killEmpty(array) { function pivot(array) { var empty = false; return array.reduceRight(function (r, a, i) { empty = empty || a.some(function (b) { return b; }); empty && a.forEach(function (b, j) { r[j] = r[j] || [] r[j][i] = b; }); return r; }, []); } return pivot(pivot(array)); } var data = [['field 1', '', 'field 2', ''], ['field 1', '', 'field 2', ''], ['field 1', '', 'field 2', ''], ['', '', '', '']], data2 = [['field 1', 'field 2', '', ''], ['field 1', 'field 2', '', 'content'], ['field 1', 'field 2', 'content', ''], ['', '', 'content', ''], ['', 'content', '', '']]; document.write('<pre>pre ' + JSON.stringify(data, 0, 4) + '</pre>'); document.write('<pre>post ' + JSON.stringify(killEmpty(data), 0, 4) + '</pre>'); document.write('<hr><pre>pre ' + JSON.stringify(data2, 0, 4) + '</pre>'); document.write('<pre>post ' + JSON.stringify(killEmpty(data2), 0, 4) + '</pre>');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.