2016-10-29 10 views
2

オブジェクトの2つの配列を結合しようとしています。2つのソートされたオブジェクトの配列をプロパティでlodashを使用してマージする

私はそれらのオブジェクトが一致するようにオブジェクトの配列をプリソートしました。両方の配列の各オブジェクトにプロパティをプッシュするだけです。

ロダッシュは私にはdouble forループよりも洗練されたソリューションを提供するだろうと思いますが、私はバニラJSソリューションを行うべきですか?それは返す必要があり

[ 
    { 
     provider: 'foo', 
     title: 'Title1' 
    }, 
    { 
     provider: 'bar', 
     title: 'Title2' 
    } 
] 

[ 
    { 
     all: '0', 
     novelty: '24' 
    }, 
    { 
     all: '4', 
     novelty: '12' 
    } 
] 

2つの配列の例に

[ 
    { 
     provider: 'foo', 
     title: 'Title1', 
     all: '0', 
     novelty: '24' 
    }, 
    { 
     provider: 'bar', 
     title: 'Title2', 
     all: '4', 
     novelty: '12' 
    } 
] 
+0

lodashがロードされている場合は、手に持っているツールを使用し、それを使用する:

は例えば、ここでhttp://www.algolist.net/Algorithms/Merge/Sorted_arraysのJSの実装です。 –

+0

これはちょうどニックピックですが、これはJS配列ですが、有効なJSONではありません。 –

+1

フェア。申し訳ありませんが、オブジェクトはAPI呼び出しから返されますが、それは問題とは関係ありません。 – Tulun

答えて

2

(アサインがターゲットブラウザでサポートされていない場合、またはangular.merge())あなたはArray.prototype.map()Object.assign()を使用することができますlodashなし:

var arr1 = [{ 
 
     provider: 'foo', 
 
     title: 'Title1' 
 
    }, { 
 
     provider: 'bar', 
 
     title: 'Title2' 
 
    }]; 
 

 
    var arr2 = [{ 
 
     all: '0', 
 
     novelty: '24' 
 
    }, { 
 
     all: '4', 
 
     novelty: '12' 
 
    }]; 
 

 
    var result = arr1.map(function(item, index) { 
 
     return Object.assign({}, item, arr2[index]); 
 
    }); 
 

 
    console.log(result);
あなたは _.assign()でlodash使用 _.zipWith()を使用したい場合は

var arr1 = [{ 
 
    provider: 'foo', 
 
    title: 'Title1' 
 
}, { 
 
    provider: 'bar', 
 
    title: 'Title2' 
 
}]; 
 

 
var arr2 = [{ 
 
    all: '0', 
 
    novelty: '24' 
 
}, { 
 
    all: '4', 
 
    novelty: '12' 
 
}]; 
 

 
var result = _.zipWith(arr1, arr2, function(a, b) { 
 
    return _.assign({}, a, b); 
 
}); 
 

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

+0

これは機能しました(ロダッシュなし)。 私はそれが必要かもしれない場合(これはAngularプロジェクトです)、プロジェクトにlodashを注入する方法を見つけ出すことができるかどうかを見ていきたいと思いますが、それほど簡単ではないので、 – Tulun

+0

map、reduce、forEach、every、some、...などの配列メソッドと、angleのユーティリティをマージするなど、ほとんどの場合lodashは必要ありません。 lodashを含める場合は、グローバルとして、またはアンサーサービスでラップすることができます。 –

2

をあなたはES6でこれを行うことができます。

data1.map((obj, i) => Object.assign({}, obj, data2[i])) 

var data1 = [{ 
 
     provider: 'foo', 
 
     title: 'Title1' 
 
    }, { 
 
     provider: 'bar', 
 
     title: 'Title2' 
 
    }]; 
 
var data2 = [{ 
 
     all: '0', 
 
     novelty: '24' 
 
    }, { 
 
     all: '4', 
 
     novelty: '12' 
 
    }]; 
 

 
var merged = data1.map((obj, i) => Object.assign({}, obj, data2[i])); 
 

 
console.log(merged);

+0

私はES6の砂糖なしでこれを使用し、それは働いた。 – Tulun

+0

私に知らせてくれてありがとう;-) – trincot

0

これまでのところ、入力配列があらかじめソートされているという条件が無視されるという点で、この質問に対するその他の回答は最適ではありません。 AFAIK lodashには、ソートされた配列をマージするための事前構築されたメソッドはありませんが、 "マージソートされた配列"のGoogle検索では、多くの疑似コードがエミュレートされます。

const mergeSortedArraysBy = (array1, array2, iteratee) => { 
    const mergedArray = []; 
    let i = 0; 
    let j = 0; 
    while (i < array1.length && j < array2.length) { 
     if (iteratee(array1[i]) <= iteratee(array2[j])) { 
      mergedArray.push(array1[i]); 
      i++; 
     } else { 
      mergedArray.push(array2[j]); 
      j++; 
     } 
    } 
    if (i < array1.length) { 
     for (let p = i; p < array1.length; p++) { 
      mergedArray.push(array1[p]); 
     } 
    } else { 
     for (let p = j; p < array2.length; p++) { 
      mergedArray.push(array2[p]); 
     } 
    } 
    return mergedArray; 
}; 
関連する問題