2017-10-11 117 views
3

我有一個數組數組,每個數組都包含兩個元素。如何通過過濾第一個元素從數組中返回第二個元素?來自陣列的Javascript過濾器值

例如我有以下的陣列和我的功能應該從每個子陣列返回第二個元素,其中第一項是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);

+0

'filter'不'map' - 我想你想'map'(和濾波器濾除不需要的結果) –

+0

我同意上面的評論:我認爲你需要重新閱讀'filter'的文檔。基於你的過濾函數的返回,它將保留或不保存當前元素。它不會修改它或使用您返回的對象。 – sjahan

回答

5

你可以使用條件過濾,然後你需要映射只有一部分,你想要的。

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

Array#filter返回數組的原始項目,而不更改某些內容。

filter()方法創建與通過由提供的功能實現的測試中所有元素的數組。

對於過濾,回調需要返回一個被解釋爲布爾值的值,也就是說,每個真值(如對象,數組或任何非零數等)將結果集的項目。

如果您只想使用內部數組的一部分,並且該部分是一個佔空比值,那麼過濾就可以工作,但它不會使用返回值,因爲它不是用於此目的的。該及格,謂語,所以在你的情況下,這將是對item哪個項目1是真的

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

+0

你能解釋爲什麼這不起作用嗎? var array = filter.filter((a)=> {if(a [0] == 8)return a [1]}) –

+0

Array#filter過濾數組,刪除「過濾器測試」失敗的元素,但不要以其他方式更改陣列。 Array#map更改數組,但不刪除元素 –

+1

@Valip,您可以稍後使用'result = result.slice(0,2)'爲前2個元素對數組進行切片。 –

2

Array.prototype.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);

或者使用減少:

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每個元件(第一[8, 'first'],下[8, 'second']等)的功能將被評估,並且其返回true,將被添加到新的數組元素:

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

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

你能解釋爲什麼這不起作用嗎? var ans = array.filter((a)=> {if(a [0] == 8)return a [1]}) –

+0

我已更新我的答案。如果有更多的問題讓我知道 –

0

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

試試這個:

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

第一張地圖,然後過濾,除去不確定的值。

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

0

必須同時過濾掉你不想條目並在條目中的條目,只是第二個值映射。

在一般情況下,最好的辦法是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

1

你可以使用函數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這將在一個循環完成。

-1

您可以利用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']