2016-08-14 75 views
1

我有這樣的陣列和變量:如何讓Javascript映射函數不返回具體的值?

var freqId = 45; 

$scope.frequencies = [{Id:124,name:'qqq'}, 
         {Id:589,name:'www'}, 
         {Id:45,name:'eee'}, 
         {Id:567,name:'rrr'}] 

我使用該行來獲取所有的ID從陣列上方:

var inspectionsId = $scope.frequencies.map(function (obj) { return obj.Id; }) 

結果我得到的是:

var Id's = [124,589,45,567]; 

我需要改變這一行:

$scope.frequencies.map(function (obj) { return obj.Id; }) 

從頻率數組中檢索所有id,除了id等於freqId變量。

例如期望的結果是:

var inspectionsId = [124,589,567]; 

任何想法,我怎麼能implemet呢?

+0

'變種inspectionsId = $ scope.frequencies.map(OBJ => obj.Id) .filter(id => id!= freqId);' –

+0

'var inspectionsId = $ scope.frequencies.filter(obj => obj.Id!= freqId).map(obj => obj.Id);' –

+0

first'過濾器'然後'地圖' – webdeb

回答

4

還可以使用Array.prototype.reduce做到既過濾和映射在單個循環:

var freqId = 45; 
 

 
$scope = {}; // Dummy scope 
 

 
$scope.frequencies = [{ 
 
    Id: 124, 
 
    name: 'qqq' 
 
}, { 
 
    Id: 589, 
 
    name: 'www' 
 
}, { 
 
    Id: 45, 
 
    name: 'eee' 
 
}, { 
 
    Id: 567, 
 
    name: 'rrr' 
 
}] 
 

 
var result = $scope.frequencies.reduce(function(result, current) { 
 
    if (current.Id != freqId) { 
 
    result.push(current.Id); 
 
    } 
 

 
    return result; 
 

 
}, []); 
 

 
console.log(JSON.stringify(result));

+0

確實。有些人稱這是「減少」的濫用行爲,因爲「累加器」值永遠不會改變,並且很容易誤寫(忘記返回累加器)。但這是一個常見的成語。 –

+0

@ T.J.Crowder是的,它可能容易出錯。順便說一句,生活本身也是錯誤的:D –

+0

'的確如此。編程是非常重要的。 –

2

您可以使用Array.prototype.filter

var inspectionsId = $scope.frequencies 
    .map(function(obj) { return obj.Id; }) 
    .filter(function(id) { return id !== 45 }) 
2

map設計來轉換數據,沒有過濾。爲後者鏈接filter

var freqId = 45; 
 

 
var input = [{ 
 
    Id: 124, 
 
    name: 'qqq' 
 
}, { 
 
    Id: 589, 
 
    name: 'www' 
 
}, { 
 
    Id: 45, 
 
    name: 'eee' 
 
}, { 
 
    Id: 567, 
 
    name: 'rrr' 
 
}]; 
 

 
var output = input.map(function(obj) { 
 
    return obj.Id; 
 
}).filter(function(element) { 
 
    return element != freqId 
 
}); 
 

 
console.log(output);

+2

我會做相反的事情:在已經過濾的陣列上調用地圖 –

+1

@MatíasFidemraizer :微選擇寶寶! :-) –

1

你已經看到了filter答案。 99.999%的時間,這是要走的路。

如果你有真正大規模數組,你想通過它來只是一個單一的傳球是非常重要的,你可以給自己結合mapfilter功能:

// A value to use to mean "leave entry out" 
 
Object.defineProperty(Array.prototype, "OMIT", { 
 
    value: {} 
 
}); 
 
// The utility function 
 
Object.defineProperty(Array.prototype, "mapFilter", { 
 
    value: function(f, thisArg, omissionFlag) { 
 
    var result = []; 
 
    if (arguments.length < 3) { 
 
     omissionFlag = Array.OMIT; 
 
    } 
 
    Object.keys(this).forEach(function(index) { 
 
     var value = f.call(thisArg, this[index], index, this); 
 
     if (value !== omissionFlag) { 
 
     result.push(value); 
 
     } 
 
    }, this); 
 
    return result; 
 
    } 
 
}); 
 

 
// Using it 
 
var freqId = 45; 
 

 
var input = [{Id: 124, name: 'qqq'}, {Id: 589, name: 'www'}, {Id: 45, name: 'eee'}, {Id: 567, name: 'rrr'}]; 
 

 
var output = input.mapFilter(function(obj) { 
 
    return obj.Id == freqId ? Array.OMIT : obj.Id; 
 
}); 
 

 
console.log(output);

此版本最多可接受三個參數:

  1. 地圖/過濾功能

  2. 值到回調

  3. 值期間this使用用來表示「省略該條目,」它調用默認爲Array.OMIT

它的值,索引和數組的回調就像forEachmap等等。

此外,雖然,我會強調,在廣袤的,絕大多數情況下,filter,然後map(或map然後filter如果map使得filter荷蘭國際集團更容易)是要走的路。


這就是說,一個通用的「循環使用備忘錄」功能,具有更廣泛的適用性:

// The utility function 
 
Object.defineProperty(Array.prototype, "memoLoop", { 
 
    value: function(memo, f, thisArg) { 
 
    Object.keys(this).forEach(function(index) { 
 
     f.call(thisArg, memo, this[index], index, this); 
 
    }, this); 
 
    return memo; 
 
    } 
 
}); 
 

 
// Using it 
 
var freqId = 45; 
 

 
var input = [{Id: 124, name: 'qqq'}, {Id: 589, name: 'www'}, {Id: 45, name: 'eee'}, {Id: 567, name: 'rrr'}]; 
 

 
var output = input.memoLoop([], function(result, obj) { 
 
    var id = obj.Id; 
 
    if (id != freqId) { 
 
    result.push(id); 
 
    } 
 
}); 
 

 
console.log(output);

這是一個有點像Array#reduce但假定不變的備忘錄值(在本例,新的數組),它在一定程度上簡化了回調。