2015-12-22 43 views
1

我正在處理相當複雜的對象。它包含了2個陣列,其中包含每個對象的3個數組:如果內部數組滿足條件,則移除外部數組對象

enter image description here

我試圖刪除歷史記錄中的一個:數組[2]如果它的一個對象的用戶名是:零。

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

這不是在這種情況下工作,因爲對象不止一個人可能的用戶名== NULL在這種情況下,它將刪除多個歷史對象,而不僅僅是我想要的那個。

如何刪除一個特定的歷史數組索引if username == null

+0

是什麼阻止你剛剛經歷resultsArray迭代和它的子陣列用(;;)語法定時,然後在遇到和處理第一個匹配時打破循環? – matmo

+0

在第一場比賽之後打破內部數組會阻止整個事情,而不會評估第二個(本例中)歷史:Array [2]。對? –

+1

在這個問題中描述的所有可能的選項:http://stackoverflow.com/questions/6260756/how-to-stop-javascript-foreach – Dmitry

回答

-1

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

splice是邪惡的。我想用一成不變的陣列方法就像過濾器可能會更容易推理:

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

經歷所有的歷史,不包括他們在過濾器,如果他們有一個用戶名是空。

0

你應該寫這樣的事:

var resultsArray = result.history.filter(function(item){ 
    return !item.some(function(inner){ return inner.username==null; }); 
}); 
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); 
+0

這是外部項目的發生,如果其中一個內部有一個空的用戶名。 –

+0

是的,我錯過了,對不起。我認爲這些是潛在的解決方案。 – matmo

0

我會用lodash這樣的:

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

這裏有一個的jsfiddle:

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