2016-08-14 7 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がfreqId変数の場合を除いて周波数配列からすべてのIDを検索します。

例えば望ましい結果は次のとおりです。

var inspectionsId = [124,589,567]; 

私はそれをimplemetすることができますどのように任意のアイデア?

+0

'VAR 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' filter' then 'map' – 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

確かに。これは、 "accumulator"の値が決して変わらないので、これを 'reduce'の乱用と呼びます。そして、アキュムレータを返すのを忘れることは間違いなく簡単です。しかし、それは一般的なイディオムです。 –

+0

@ T.J.Crowderええ、それはエラーが発生する可能性があります。 BTWの人生そのものもエラーが起こりやすい: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%、それは行く方法です。

あなたは本当に大規模な配列を持っていて、それはそれを介して1つだけのパスを作ることが重要だと思うならば、あなたは自分で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);

このバージョンでは、最大3つの引数を使用できます。

  1. マップ/フィルタ機能を意味するために使用するコールバック

  2. 中にthisとして値を使用する

  3. 値「このエントリを省略し、」それが呼び出すArray.OMIT

デフォルトその値、インデックス、および配列のコールバックはforEachmapのようになります。

mapが簡単INGのfilterを行う場合やmap、その後、filter)繰り返しますが、しかし、私は、例広大な、大多数のそれを強調filter、その後mapます移動するための方法です。我々の場合で

// 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ようなものだが、不変のメモ値をとる(:言っ


、一般的な「ループメモ付き」機能は、より広範な適用性を持っています、新しい配列)、コールバックを多少簡素化します。

関連する問題