如果内部数组满足条件

时间:2015-12-22 21:56:45

标签: javascript jquery arrays

我正在处理一个相当复杂的对象。它包含2个数组,每个数组包含3个数组:

enter image description here

我正在尝试删除其中一个历史记录:Array [2]如果其中一个对象具有username:null。

var resultsArray = result.history;
var arrayCounter = 0;

resultsArray.forEach(function(item) {
    item.forEach(function(innerItem) {
        if (innerItem.username == null) {
            resultsArray.splice(arrayCounter,1);
        };
    });
    arrayCounter++;
});

通过回答,建议做类似的事情:

resultsArray.splice(arrayCounter,1);

这不适用于这种情况,因为多个对象可能有username == null,在这种情况下,它将删除多个历史对象,而不仅仅是我想要的那个。

如果username == null

,我如何只删除一个特定的历史数组索引?

5 个答案:

答案 0 :(得分:1)

splice是邪恶的。我认为使用像过滤器这样的不可变数组方法可能更容易推理:

x.history =
  x.history.filter(function (h) {
    return !h.some(function (item) {
      return item.username === null
    })
  })

浏览所有历史记录,如果用户名为null,则不要将它们包含在过滤器中。

答案 1 :(得分:1)

我的理解是你只想删除第一个外部数组,该数组具有一个内部数组,该数组的对象具有空用户名。下面是一个最接近当前形式的解决方案:

var resultsArray = result.history;
var arrayCounter = 0;
var foundFirstMatch = false;

resultsArray.forEach(function(item) {
    if (!foundFirstMatch) {
        item.forEach(function(innerItem) {
            if (innerItem.username == null && !foundFirstMatch) {
                foundFirstMatch = true;
            };
        });
        arrayCounter++;        
     }
});


if (foundFirstMatch > 0)
    resultsArray.splice(arrayCounter, 1);

其他语法:

var resultsArray = result.history;
var outerNdx;
var innerNdx;
var foundMatch = false;

for (outerNdx = 0; !foundMatch && outerNdx < resultsArray.length; outerNdx++) {
   for (innerNdx = 0; !foundMatch && innerNdx < resultsArray[outerNdx].length; innerNdx++) {
      if (resultsArray[outerNdx][innerNdx].username == null) {
         foundMatch = true;
      }
    }
 }

 if (foundMatch)
    resultsArray.splice(outerNdx, 1);

答案 2 :(得分:1)

更新 - 这里是我现在如何做到的,没有lodash:

thing.history.forEach((arr, i) => {
  thing.history[i] = arr.filter( (x) => x.username !== null );
});

上一个回答:

我这样使用lodash:

_.each(thing.history, function(array, k){
  thing.history[k] = _.filter(array, function(v){
    return v.username !== null;
  })
});

这是一个小伙伴:

https://jsfiddle.net/mckinleymedia/n4sjjkwn/2/

答案 3 :(得分:0)

你应该写这样的东西:

var resultsArray = result.history.filter(function(item){
    return !item.some(function(inner){ return inner.username==null; });
});

答案 4 :(得分:0)

foreach循环不能以这种方式中断,但是常规for循环可以。这是有效的:

result.history.forEach(function(item) {
    loop2:
    for (var i = 0; i < item.length; i++) {
        var innerItem = item[i];
        console.log(innerItem);
        break loop2;
    }
});