2016-11-24 174 views
2

在我的代碼,我有一個數組,它是象下面這樣:如何在foreach循環返回元素

localStroge_Procrastinator_tasks = [object , object, object] 

現在我想使用foreach循環數組在迭代和返回時的標識對象與我提供的ID相匹配,讓我列出代碼以使我的示例清晰。

storeRelevantObj = localStroge_Procrastinator_tasks.forEach(function(e, i){ 
    if (e.task_Id === task_Id) { 
     return e; 
    } 
}); 

但wheni運行代碼即使如果返回conditon傳球和E,storeRelevantObj仍然是空的,爲什麼呢?爲什麼返回聲明不起作用?

回答

2

不要使用forEach()過濾,使用filter()代替:

var storeRelevantObj = localStroge_Procrastinator_tasks.filter(function(e) { 
    return e.task_Id === task_Id; 
})[0]; 

如果你不介意的IE瀏覽器的支持,您可以使用find()方法時返回的第一個元素滿足條件(它也是更高性能的,因爲它可以在第一次匹配時立即返回):

var storeRelevantObj = localStroge_Procrastinator_tasks.find(function(e) { 
    return e.task_Id === task_Id; 
}); 

另外,如果你的目標ES6或使用transpiler(如Babel),您的謂語可以使用Arrow Function表示:

var storeRelevantObj = localStroge_Procrastinator_tasks.find(e => e.task_Id === task_Id); 
+0

是的,謝謝你的真棒回答! :) –

1

使用Array#filter,而不是Array#forEach

隨着Array#forEach,空數組可以初始化並做Array#push如果條件得到滿足!

使用Array#filter,新陣列與所有元素通過測試返回!

var storeRelevantObj = localStroge_Procrastinator_tasks.filter(function(e, i) { 
    return e.task_Id === task_Id; 
}); 
0

這裏需要使用過濾器功能。因爲你想返回一個數組。您正在使用的forEach將繼續覆蓋storeRelevantObj的值。

代碼:

storeRelevantObj = localStroge_Procrastinator_tasks.filter((e, i)=>{ return (e.task_Id === task_Id); });

如果你需要使用的forEach,你應該這樣做:

localStroge_Procrastinator_tasks.forEach((e, i)=>{ if (e.task_Id === task_Id){ storeRelevantObj.push(e)
}; });

0

使用Array#filter,會返回一個新的數組。你也可以使用Array#reduce
var storeRelevantObj = localStroge_Procrastinator_tasks.reduce(function(prev, cur) { return prev || cur.task_id == task_id; }, false);

但是,這隻會返回第一個匹配的值。而filter將返回一個具有所有匹配值的數組

0

以下documentation指出,除了拋出異常外,沒有辦法從forEach。如果你需要這樣的行爲,它也會提到你的選擇!

你也可以使用一個簡單的for循環方式如下:

localStroge_Procrastinator_tasks = [object , object, object]; 

var i, l, match; 


l = localStroge_Procrastinator_tasks.length; 
for(i=0;!match&&i<l;++i){ 
    match = localStroge_Procrastinator_tasks[i].task_Id === task_Id; 
} 

如果匹配設置爲true,在循環中再接下來的評測將不會進行!