删除嵌套数组的最后一个元素并完成最后一个数组

时间:2016-04-02 20:19:31

标签: javascript jquery arrays

有一个包含多个数组的数组。我的目标是用这些数据构建一个html表。因此,每个阵列的长度必须相同。

现在我要删除空行或colomns:如果每个数组的所有最后一个元素都为空(=空字符串)或者最后一个数组只有空字符串,则应删除它们。

所以这个

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;
}

到目前为止这是有效的。但如果最后有两个空行或colomns,我该怎么办?

示例:

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', '', '' ]
];

3 个答案:

答案 0 :(得分:1)

您可以将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);

DEMO

答案 1 :(得分:0)

这是一种方法:使用map,我们遍历每个数组,然后过滤掉空字符串,最后过滤掉空数组的左边。

Working Fiddle for the code below

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);

答案 2 :(得分:0)

一个小的数据透镜可以帮助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>');