23

別のオブジェクトに基づいて、オブジェクトの配列をフィルタリングしようとしています。共通プロパティ id id。filter + each がそれを行うための最良の方法であるか、マップを減らすかはわかりません。outとにかく、以下のコードは空のリストであるため機能しません。

var aaa = [
    {name: "AAA", id: 845},
    {name: "BBB", id: 839},
    {name: "CCC", id: 854}
];
var bbb = [
    {id: 839},
    {id: 854}
];

var out = _.filter(aaa, function(val){
    return _.each(this, function(val2){
        return val['id'] === val2['id']
    });
}, bbb);
4

4 に答える 4

40

有効なIDの「セット」を作成し、その「セット」を使用してフィルタリングを実行するだけです。

var aaa = [
    {name: "AAA", id: 845},
    {name: "BBB", id: 839},
    {name: "CCC", id: 854}
];
var bbb = [
    {id: 839},
    {id: 854}
];

var ids = {};
_.each(bbb, function (bb) { ids[bb.id] = true; });

var out = _.filter(aaa, function (val) {
    return ids[val.id];
}, bbb);

充填idsは高速で、n *償却されたO(1)、つまりO(n)になります。フィルタリングについても同じことが言えます。

each(…)内側のループで使用する場合は、O(n²)になります。より大きなデータセットの場合、これは非常に遅くなります。また、追加のネストにより、コードが一見しただけで読みにくくなり、理解しにくくなります。

そのコードが実際に切り取られていることを確認してください: http://jsfiddle.net/SMtX5/

于 2013-02-27T03:23:35.970 に答える
20

_.findフィルタリングに使用できます:

_.filter(aaa, function(a){
    return _.find(bbb, function(b){
        return b.id === a.id;
    });
});
于 2013-02-27T03:36:57.903 に答える
2

使用できます_.some(list, [iterator], [context])

リスト内のいずれかの値が反復子の真偽テストに合格すると、 trueを返します。

var out = _.filter(aaa, function(val){
    return _.some(this,function(val2){
        return val2['id'] === val['id'];
    });
}, bbb);

ここにjsfiddleがあります。http://jsfiddle.net/h98ej/

于 2013-02-27T03:34:33.093 に答える
2
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)

ユースケースを想定してそれを行うには、純粋なJS配列関数が必要です。

于 2017-06-01T14:29:59.860 に答える