2017-11-02 3 views
1

一連の一致するプロパティに基づいて配列内の文字列のセットをマージし、重複していたアイテムを削除しようとしています。配列内のオブジェクトを他の値に基づいてマージする

私の現在の配列:

{id: "12", value: "Option 1"}, 
{id: "55", value: "Option A, Option B, Option C, Option D"}, 
{id: "106", value: "Option} 

私はマージするために管理することができます。

{id: "12", value: "Option 1"}, 
{id: "55", value: "Option A"}, 
{id: "55", value: "Option B"}, 
{id: "55", value: "Option C"}, 
{id: "55", value: "Option D"}, 
{id: "106", value: "Option 1"} 

は、私は私の配列は次のようになりますので、「55」のIDを持つすべてのアイテムをマージしたいです最初の2つの項目は、forループを使用し、-1兄弟をチェックし、私のコードに深刻な鼓動なしでこれを行うにはうまくいかない。

アドバイスをいただければ幸いです。並行して配列に結果を格納しながら、

+0

あなたのループコード用を投稿することができます。 – schylake

+0

Usman Ranaが投稿した(入れ子になったforループ)ものをほぼ正確に使っていましたが、私は条件を忘れてしまいました。 – Paul

答えて

2

あなたは、ルックアップテーブルなどのオブジェクトを使用することがあります。

const lookup = {}, result = []; 

for(const {id, value} of input){ 
    if(lookup[id]){ 
    lookup[id].value += "," + value; 
    }else{ 
    result.push(lookup[id] = {id, value}); 
    } 
} 

は、これは非常に新しいjavascriptのですが、現代のエンジンにそれworks;)

1

ビット遅くなるかもしれません。しかし、for/whileループでこれを試すことができます。これは非常に基本的なアプローチです。そして、時間の複雑さが懸念されないなら。そうでなければJons wの答えは良いです。

var x = [{id: "12", value: "Option 1"}, 
 
{id: "55", value: "Option A"}, 
 
{id: "55", value: "Option B"}, 
 
{id: "55", value: "Option C"}, 
 
{id: "55", value: "Option D"}, 
 
{id: "12", value: "Option D"}, 
 
{id: "53", value: "Option D"}, 
 
{id: "106", value: "Option 1"}]; 
 

 
for(var j =0; j<x.length;j++){ 
 
for(var i =0; i<x.length;i++){ 
 
    if(x[j].id == x[i].id && i !=j){ 
 
    x[j].value = x[j].value + "," +x[i].value; 
 
    x.splice(i, 1); 
 
    } 
 
    } 
 
} 
 
console.log(x);

+0

ありがとうUsman、forループでネストされたforループを試していましたが、i!= jを忘れて問題が発生しました。私はコードのかなり小さなスニペットですが、私は最初の答えを受け入れましたが、これは私が元々行っていたものです。 – Paul

+0

あなたはまだそれをupvote与えることができます:p –

+0

linting、linting、linting ...そしてあなたはスプライシング後iを減らす必要がある...しかし、まだ:ありがとう;) –

0

あなたはarray#reduceを使用することができます。

const data = [{id: "12", value: "Option 1"},{id: "55", value: "Option A"},{id: "55", value: "Option B"},{id: "55", value: "Option C"},{id: "55", value: "Option D"},{id: "106", value: "Option 1"}]; 
 

 
var result = data.reduce((r, o) => { 
 
    return r[o.id] = r[o.id] ? (r[o.id].value += ", " + o.value, r[o.id]) : o, r; 
 
},{}) 
 

 
var output = Object.values(result); 
 
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題