检查所有数组的最后一个元素是否为空

时间:2016-04-02 12:48:12

标签: javascript jquery arrays

我需要检查数组的所有元素是否都有一个空字符串作为** last *元素。如果是这种情况,则应删除它们。

所以这......

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

这个数组:

var data = [
    [ 'field 1', 'field 2', '' ],
    [ 'field 1', 'field 2', 'field 3' ],
    [ 'field 1', 'field 2', '' ]
];

不应该被更改 - 因为第二个数组的最后一个元素不是空字符串。

5 个答案:

答案 0 :(得分:1)

使用while循环,Array.mapArray.slice函数的简单解决方案:

function checkLastItemEmpty(data) {
    var unchanged = false, len = data.length, last, new_arr;

    while (len--) {
        last = data[len][data[len].length - 1];
        if (last) {
            unchanged = true;
            break;
        }
    }

    // if the initial array should be changed with deleting the last value of each item
    if (!unchanged) {
        data = data.map(function (v) {
            return v.slice(0, -1);
        });
    }
    return data;
}

var data = checkLastItemEmpty(data);

至于你的额外要求:&#34; 如果我想删除所有空元素?示例:[ 'one', '', '', '' ]应该变为[ 'one' ](如果所有其他数组都具有相同的空元素)&#34;) - 这是 其他方法 < / strong>使用Array.some函数:

function checkLastItemEmpty(data) {
    var unchanged = false, len = data.length, last_items, new_arr;

    while (len--) {
        last_items = data[len].slice(1).some(function(v){  return Boolean(v); });
        if (last_items) {
            unchanged = true;
            break;
        }
    }

    if (!unchanged) {
        data = data.map(function (v) {
            return v.slice(0,1);
        });
    }
    return data;
}

答案 1 :(得分:0)

我们的想法是将最后一个元素放在一个数组中并检查数组的所有项是否为空

var all_empty = checkArray.every(function(v) { return v.length == 0; });

如果checkArray的单个值不为空,则对数组不执行任何操作,否则删除初始数组的所有最后一项:

for(var i = 0; i < data.length; i++){
    if(all_empty){
      data[i].splice(-1)
    }
}

例如:

var data = [
    [ 'field 1', 'field 2', '' ],
    [ 'field 1', 'field 2', '' ],
    [ 'field 1', 'field 2', '' ]
];

checkArray将为['','','']     和     all_empty将为true     因此您可以使用data.splice

删除

但是如果

var data = [
    [ 'field 1', 'field 2', '' ],
    [ 'field 1', 'field 2', 'field 3' ],
    [ 'field 1', 'field 2', '' ]
];

checkArray将为['','field 3','']

https://jsfiddle.net/2r6s9ad1/3/

答案 2 :(得分:0)

&#13;
&#13;
var data = [
  ['field 1', 'field 2', ''],
  ['field 1', 'field 2', ''],
  ['field 1', 'field 2', '']
];

var data2 = [
  ['field 1', 'field 2', ''],
  ['field 1', 'field 2', 'field 3'],
  ['field 1', 'field 2', '']
];


function removeEmpty(data) {
  var isEmpty = 0;

  data.forEach(function(arr) {
    if (arr[arr.length - 1]) {
      isEmpty++;
    }
  });

  if (!isEmpty) {
    data.forEach(function(arr) {
      return arr.pop();
    });
    return data;
  }
  return data;
}

console.log(removeEmpty(data));
console.log(removeEmpty(data2));
&#13;
&#13;
&#13;

输出:

first array [["field 1", "field 2"], ["field 1", "field 2"], ["field 1", "field 2"]]

second array [["field 1", "field 2", ""], ["field 1", "field 2", "field 3"], ["field 1", "field 2", ""]]

答案 3 :(得分:0)

您需要至少传递一次数据,以检查嵌套数组的任何最后一个元素的状态是否为空字符串。如果只有一个是你可以举起一个标志,只是简单地返回数组。如果标记没有被提升并且它们全部为空,则需要再次遍历数组以删除这些元素。

function looper(arr, pass) {

  // copy the array on the first pass
  // so we don't break the original
  var tmp = !pass ? arr.slice(0) : arr;
  var flag = false;
  pass = pass || 0;
  var index = -1;
  var a = tmp[0].length - 1;
  while (++index < tmp.length) {

    // on the first pass if one of the last elements
    // is not an empty string set the flag to true and break
    // out of the loop
    if (!pass && tmp[index][a] !== '') {
      flag = true;
      break;
    }

    // if we're on our second pass remove the last element(s)
    if (pass) tmp[index].pop();
  }

  // if we're on the first pass and the flag
  // is not set, loop over the array again
  // and remove the last elements
  if (!pass && !flag) looper(tmp, ++pass);

  // return the completed array
  return tmp;
}

looper(data);

DEMO

答案 4 :(得分:0)

这也是一个不错的小功能。
只需提供function array即可 return array新{。} 非常简单的逻辑。

var data = [
  ['field 1', 'field 2', ''],
  ['field 1', 'field 2', ''],
  ['field 1', 'field 2', '']
];

function checkEmpty(array) {
  var tmpArr = array;
  for (var i = 0; i < tmpArr.length; i++) {
    if (tmpArr[i].indexOf("") === -1 | tmpArr[i].lastIndexOf("") !== tmpArr.length - 1) {
      return array; // if there is no "" or "" is not the last index -> stop and return old array
    } else {
      tmpArr[i].pop(); // else delete "" from array
    }
  }
  return tmpArr;
}


var newData = checkEmpty(data); // <-- newData is the result

document.write(JSON.stringify(newData)); // display result