簡體   English   中英

Javascript過濾數組中的值

[英]Javascript filter values from array

我有一個數組數組,每個數組包含兩個元素。 如何通過過濾第一個元素從數組中返回第二個元素?

例如,我有以下數組,我的函數應該返回第一項為8每個子數組中的第二個元素:

var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];

預期結果: ['first', 'second', 'third']

這是我到目前為止實現的,但它返回兩個元素而不是每個數組中的第二個元素匹配...

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.filter(function(item){ if(item[0] == 8) { return item[1]; } }); console.log(result); 

您可以使用條件進行過濾,然后您只需要映射您想要的部分。

在單個循環中,只能使用Array#reduce ,因為在這里您可以操作結果集的值。

Array#filter返回Array#filter的原始項,而不更改任何內容。

filter()方法創建一個新數組,其中包含所有傳遞由提供的函數實現的測試的元素。

對於過濾,回調需要返回一個被解釋為boolean的值,這意味着每個truthy值(如對象,數組或任何非零數字等)都會獲取結果集的項。

如果你只想使用內部數組的一部分並且該部分是一個truty值,那么過濾可以工作,但它不會獲取返回值,因為它不是為此而設的。

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']], result = array.filter(function(item){ return item[0] === 8; }). map(function (a) { return a[1]; }); console.log(result); 

Array.prototype.filter返回及格,謂語,所以在你的情況下,這將是件item的哪個項目1是正確的。 要實現您想要的效果,您需要先使用map過濾項目和提取secon元素:

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.filter(function(item) { return item[0] == 8; }).map(function (item) { return item[1]; }); console.log(result); 

或者使用reduce:

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.reduce(function(result, item) { return item[0] == 8 ? result.concat(item[1]) : result; }, []); console.log(result); 

如果您想使用ES6的功能,它可以縮短事件:

 const array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; const result1 = array.filter(([item]) => (item == 8)).map(([,item]) => item); const result2 = array.reduce((res, [n, str]) => n == 8 ? [...res, str] : res, []); console.log(result1); console.log(result2); 

編輯:要了解您的函數無法正常工作的原因,您需要了解Array.prototype.filter()工作原理。 它創建一個由元素組成的新數組,為其提供謂詞函數(即檢查某些條件並返回布爾值)返回true。 對於具有8作為第一項的所有子數組,第二個元素將決定該元素是否將用於創建新數組。

因此,對於array每個元素(first [8, 'first'] ,next [8, 'second']等),將評估您的函數,並將返回true的元素添加到新數組中:

[[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]
true,          true,          false,        true,         false

=> [[8, 'first'], [1, 'empty'], [8, 'third']]

你可以使用函數reduce

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.reduce(function(acc, item){ if(item[0] === 8){ acc.push(item[1]) } return acc; }, []); console.log(result); 

Array#reduce它將在一個循環中完成。

Array的filter方法通過傳遞在每次迭代中傳遞特定條件的項來創建新數組。

試試這個:

var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 
'empty']],resArray = [];
array.forEach(function(item){
  if(parseInt(item[0]) === 8){
    resArray.push(item[1]);
  }
});
console.log(resArray);

第一個映射,然后過濾以刪除未定義的值。

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.map(function(item){ if(item[0] == 8) { return item[1]; } }).filter(function(item) { return item; }); console.log(result); 

必須同時過濾掉你不想要的條目條目映射到剛剛在條目中的第二個值。

一般來說,最好的方法是filter然后map

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = array.filter(function(item){ return item[0] == 8; }) .map(function(item) { return item[1]; }); console.log(result); 

...但是對於一個非常大的數據集,如果你不想進行多次傳遞,你可以給自己一個filterMap函數:

 function filterMap(arr, predicate) { var result = []; arr.forEach(function(entry) { var newEntry = predicate(entry); if (newEntry !== undefined) { result.push(newEntry); } }); return result; } var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = filterMap(array, function(item){ return item[0] == 8 ? item[1] : undefined; }); console.log(result); 

該版本假設您從不希望結果中存在undefined條目,但您可以根據需要進行調整。 例如,如果您希望它真的是通用的,那么您將在filterMap上放置一個唯一值,表示“將其保留”:

 function filterMap(arr, predicate) { var result = []; arr.forEach(function(entry) { var newEntry = predicate(entry); if (newEntry !== filterMap.OMIT) { result.push(newEntry); } }); return result; } filterMap.OMIT = {}; var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]; var result = filterMap(array, function(item){ return item[0] == 8 ? item[1] : filterMap.OMIT; }); console.log(result); 

雖然你可以通過鞋拔reduce來做到這一點,但對於“累加器”不會改變的情況, reduce並不是很好。 因此,如果您經常這樣做,請給自己一個實用工具。 或者只是filtermap

您可以利用Array.reduce來實現所需的輸出 -

var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];


array.reduce(function(i, n){
    if(n[0]==8){
        i.push(n[1]);
    }
    return i;
},[]);
//output : ['first', 'second', 'third']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM