我正在处理一个相当复杂的对象。它包含2个数组,每个数组包含3个数组:
我正在尝试删除其中一个历史记录: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
?
答案 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;
})
});
这是一个小伙伴:
答案 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;
}
});