2016-05-07 2 views
2

の各項目と比較することにより、配列からオブジェクトを取得し、私はのような配列をしました:RAMDA:別の配列

ids = [1,3,5]; 

など別の配列:私が欲しいもの

items: [ 
{id: 1, name: 'a'}, 
{id: 2, name: 'b'}, 
{id: 3, name: 'c'}, 
{id: 4, name: 'd'}, 
{id: 5, name: 'e'}, 
{id: 6, name: 'f'} 
]; 

のような別の配列であります:

array = [{id: 1, name: 'a'}, {id: 3, name: 'c'}, {id: 5, name: 'e'}]; 

私はそれの周りに頭を上げることはできません。あなたが.filter.indexOfを使用することができます

console.log(R.filter(R.propEq('id', <donnow what shud be here>), items); 
console.log(R.pick(ids)(items)) 

答えて

2

せずに、1つのライナーかもしれ

Ramda REPL

const ids = [1,3,5]; 

const items = [ 
{id: 1, name: 'a'}, 
{id: 2, name: 'b'}, 
{id: 3, name: 'c'}, 
{id: 4, name: 'd'}, 
{id: 5, name: 'e'}, 
{id: 6, name: 'f'} 
]; 

R.filter(R.compose(R.flip(R.contains)(ids), R.prop('id')), items) 
3

:これまでのところ、私は次のように試してみました。これらはECMA5配列のメソッドであり、IE8では動作しません。

var ids = [1, 3, 5]; 
var items = [ 
    {id: 1, name: 'a'}, 
    {id: 2, name: 'b'}, 
    {id: 3, name: 'c'}, 
    {id: 4, name: 'd'}, 
    {id: 5, name: 'e'}, 
    {id: 6, name: 'f'} 
]; 

var filtered = items.filter(function(obj) { 
    return ids.indexOf(obj.id) > -1; 
}); 
console.log(filtered); // [{id: 1, name: 'a'}, {id: 3, name: 'c'}, {id: 5, name: 'e'}]; 
+0

これは純粋なJSなので、ラムダは必要ありませんよね? –

+0

これは間違いありません!ただし、IE8以下をターゲットにしている場合は、ポリフィルを追加する必要があります – andlrc

0

高速検索のためにハッシュテーブルを使用することをお勧めします。

var ids = [1, 3, 5], 
 
    items = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}, {id: 4, name: 'd'}, {id: 5, name: 'e'}, {id: 6, name: 'f'} ], 
 
    filtered = items.filter(function(obj) { 
 
     return this[obj.id]; 
 
    }, ids.reduce(function (r, a) { 
 
     r[a] = true; 
 
     return r; 
 
    }, Object.create(null))); 
 

 
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');

1

それとも、まだRAMDAの方法でそれをしたい場合はRAMDA

items.filter(x=>ids.includes(x.id))