2017-01-13 7 views
1

私はこのように2つの配列を単純化しました。他のオブジェクト配列に対するオブジェクト配列のフィルタリング

var a = [{ 
number: 1, 
name: "A" 
}, { 
number: 2, 
name: "B" 
}, { 
number: 3, 
name: "C" 
}, { 
number: 4, 
name: "D" 
}, { 
number: 5, 
name: "E" 
}, { 
number: 6, 
name: "F" 
}]; 

var b = [{ 
number: 3, 
name: "C" 
}, { 
number: 6, 
name: "F" 
}]; 

私が欲しいのは、aがbに対してフィルタリングされている配列を返すことです。結果はこれです。

var result = [{ 
number: 1, 
name: "A" 
}, { 
number: 2, 
name: "B" 
}, { 
number: 4, 
name: "D" 
}, { 
number: 5, 
name: "E" 
}]; 

スタックオーバーフローで他のソリューションの多くを見てきましたが、動作させることはできません。

アンダースコアのようなライブラリを使用しても問題ありません。

+0

何が "に対するフィルタ" とはどういう意味?あなたはそれらを結合したいですか?あなたはベジカの魚のすべてのアイテムをしたいですか?ユニークなアイテムが欲しいですか?明らかにする。 –

+0

lodash(アップグレードされたアンダースコア)を使用している場合は、単に_differenceBy()を使用して見つけることができます。チェックアウト私の答え –

答えて

2
var a = [{ 
number: 1, 
name: "A" 
}, { 
number: 2, 
name: "B" 
}, { 
number: 3, 
name: "C" 
}, { 
number: 4, 
name: "D" 
}, { 
number: 5, 
name: "E" 
}, { 
number: 6, 
name: "F" 
}]; 

var b = [{ 
number: 3, 
name: "C" 
}, { 
number: 6, 
name: "F" 
}]; 

var _ = require('lodash'); 
var result = _.differenceBy(a,b,'name'); 

Lodashのドキュメントを参照してください。https://lodash.com/docs/#differenceBy

+1

著者が名前フィールドだけでなく確認したい場合はどうすればいいですか? –

+2

@ MaximKuzminあなたの解決策は良いです。 –

+0

ロダッシュを使用するには、すべてのアンダースコア機能を変更する必要がありますか?彼らは一緒に働くように見えません。 – stibay

2

Array#filterを使用できます。そのようなことは:

const filterData = (a,b) => { 
    return a.filter((itemA) => { 
     return b.some((itemB) => { 
      return (itemA.number === itemB.number); 
     }); 
    }); 
} 

私はちょうどコードをテストするためにバイオリンを作成:https://jsfiddle.net/mrlew/pb1qqeyd/3/(あなたが結果を確認するために、コンソールを開く必要があります)。

それとも... 1行で:

const filterData = (a,b) => a.filter((itemA) => b.some((itemB) => (itemA.number === itemB.number))); 

EDIT.someを使用するように編集した提案を、@kzhに感謝します。

+0

'forEach'ではなく' some'を使って、配列全体を反復しないようにしてください。 – kzh

+0

@kzhあなたは正しいです!編集されました!ありがとう – mrlew

6

で実現することができます。

var a = [{ 
 
number: 1, 
 
name: "A" 
 
}, { 
 
number: 2, 
 
name: "B" 
 
}, { 
 
number: 3, 
 
name: "C" 
 
}, { 
 
number: 4, 
 
name: "D" 
 
}, { 
 
number: 5, 
 
name: "E" 
 
}, { 
 
number: 6, 
 
name: "F" 
 
}]; 
 

 
var b = [{ 
 
number: 3, 
 
name: "C" 
 
}, { 
 
number: 6, 
 
name: "F" 
 
}]; 
 

 
var result = _.differenceWith(a, b, _.isEqual); 
 

 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

0

あなたはfilter()some()every()を使用して、プレーンJavaScriptでこれを行うことができます。より多くのinformaitonについては

var a = [{"number":1,"name":"A"},{"number":2,"name":"B"},{"number":3,"name":"C"},{"number":4,"name":"D"},{"number":5,"name":"E"},{"number":6,"name":"F"}] 
 
var b = [{"number":3,"name":"C"},{"number":6,"name":"F"}] 
 

 
var result = a.filter(function(o) { 
 
    return !b.some(function(e) { 
 
    return Object.keys(o).length == Object.keys(e).length && Object.keys(o).every(function(k) { 
 
     return e[k] == o[k] 
 
    }) 
 
    }) 
 
}) 
 

 
console.log(result)

0
var v1 = JSON.parse(a); 
var v2 = JSON.parse(b); 

var v3 = [] ; 


function objectEquals(v1, v2) { 

    if (typeof(v1) !== typeof(v2)) { 
     return false; 
    } 
if (v1 instanceof Object && v2 instanceof Object) { 

    for (k in v1) { 
      r = objectEquals(v1[k], v2[k]); 
      if (!r) { 
       v3.push(v1[k]); 

      } 
     } 



} 

} 

// call the above method passing your two object, and return a new unique array 


objectEquals(v1, v2) ; 
1

あなたが別の配列との配列をフィルタリングするためにJavaScriptで内蔵filter機能を使用することができます以下のコードスニペットを確認してください。

var a = [{ 
 
    number: 1, 
 
    name: "A" 
 
}, { 
 
    number: 2, 
 
    name: "B" 
 
}, { 
 
    number: 3, 
 
    name: "C" 
 
}, { 
 
    number: 4, 
 
    name: "D" 
 
}, { 
 
    number: 5, 
 
    name: "E" 
 
}, { 
 
    number: 6, 
 
    name: "F" 
 
}]; 
 

 
var b = [{ 
 
    number: 3, 
 
    name: "C" 
 
}, { 
 
    number: 6, 
 
    name: "F" 
 
}]; 
 

 
var result = a.filter(function(currentValue, index, arr) { 
 
    var found = false; 
 
    for (var i = 0; i < b.length; i++) { 
 
    if (currentValue.number === b[i].number) { 
 
     found = true; 
 
     break; 
 
    } 
 
    } 
 

 
    if (!found) { 
 
    return currentValue; 
 
    } 
 
}); 
 

 
console.log(result);

関連する問題