2016-09-22 10 views
0

私が達成したいのは、IDの最初の2桁が一致する場合、オブジェクトをアレイ内でグループ化することです。この新しい配列にグループIDでオブジェクトのJavaScript配列を配列

[ 
    { 
     "id": "0100", 
     "name": "name 1", 
     "message": "Lorem blah blah 1" 
    }, 
    { 
     "id": "0101", 
     "name": "", 
     "message": "Lorem blah blah 1.1" 
    }, 
    { 
     "id": "0200", 
     "name": "name 2", 
     "message": "Lorem blah blah 2" 
    }, 
    { 
     "id": "0201", 
     "name": "", 
     "message": "Lorem blah blah 2.1" 
    }, 
    { 
     "id": "0202", 
     "name": "", 
     "message": "Lorem blah blah 2.2" 
    }, 
    { 
     "id": "0300", 
     "name": "name 3", 
     "message": "Lorem blah blah 3" 
    }, 
    { 
     "id": "0301", 
     "name": "", 
     "message": "Lorem blah blah 3.1" 
    }, 
    { 
     "id": "0302", 
     "name": "", 
     "message": "Lorem blah blah 3.2" 
    }, 
    { 
     "id": "0303", 
     "name": "", 
     "message": "Lorem blah blah 3.3" 
    }, 
    { 
     "id": "0304", 
     "name": "", 
     "message": "Lorem blah blah 3.4" 
    } 
] 

:だから、オブジェクトの以下の配列を指定して、私はこの元の配列を変換したい

[ 
    { 
     "id": "0100", 
     "name": "name 1", 
     "message": [ 
      "Lorem blah blah 1", 
      "Lorem blah blah 1.1" 
     ] 
    }, 
    { 
     "id": "0200", 
     "name": "name 2", 
     "message": [ 
      "Lorem blah blah 2", 
      "Lorem blah blah 2.1", 
      "Lorem blah blah 2.2" 
     ] 
    }, 
    { 
     "id": "0300", 
     "name": "name 3", 
     "message": [ 
      "Lorem blah blah 3", 
      "Lorem blah blah 3.1", 
      "Lorem blah blah 3.2", 
      "Lorem blah blah 3.3", 
      "Lorem blah blah 3.4" 
     ] 
    } 
] 

注意すべき重要なことがあり、もしIDの最初の2桁NEW ARRAYのように、これらのオブジェクトにメッセージを追加します。あなたはすべてが見ることができるように

、@Nenad Vracarは、しかし、私はまだ別の配列が関与さらに、問題持って、上記の課題にまともな答えを実証してきました。私は先の

`var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];` 

プルする」をcandidateName 'を作成し、元の配列 "result"に配列として追加します。

私はdata1.reduceループ内でdata2.forEachループを試しましたが、ハングしているようです。

var result = data.reduce(function(r, el) { 

    // THIS INNER LOOP MAKES THE BROWSER HANG!!! 
    data2.forEach(function (a){ 
    console.log('a',a); 
    }); 

    var e = el.id.slice(0, 2); 
    if (!o[e]) { 
    o[e] = { 
     id: el.id, 
     name: el.name, 
     message: [] 
    } 
    r.push(o[e]); 
    } 
    o[e].message.push(el.message); 
    return r; 
}, []) 

さらに洗練された洗練された方法がありますか?

+0

私が新鮮な質問として、それをお願いし、私だったら、私は勢いを失うことなく、この質問を拡張するにはどうすればよいソートされた配列 – passion

+0

のようですか?私はここのコメントで私の質問をすることができますか?もしそうなら、ここに行く? –

+0

私はさらなる助けを求めて来ました。私はまだ別の配列を持っています: 'var data2 = [{" CandidateName ":" Mary "、" relatedId ":[" 0100 "]}、{" CandidateName ":" John "、" relatedId ":[" 0200 " {"0300"}}、{"CandidateName": "Paul"、 "relatedId":["0300"]}] ' であり、このうち{I " 'candidateName'を取得して元の配列 "result"に配列として追加したいとします。 私はdata1.reduceループ内でdata2.forEachループを試しましたが、ハングするようです。 もっと洗練された洗練された方法がありますか? –

答えて

3

reduce()を使用すると、配列を返し、グループ化するオブジェクトを返すことができます。

var data = [{"id":"0100","name":"name 1","message":"Lorem blah blah 1"},{"id":"0101","name":"","message":"Lorem blah blah 1.1"},{"id":"0200","name":"name 2","message":"Lorem blah blah 2"},{"id":"0201","name":"","message":"Lorem blah blah 2.1"},{"id":"0202","name":"","message":"Lorem blah blah 2.2"},{"id":"0300","name":"name 3","message":"Lorem blah blah 3"},{"id":"0301","name":"","message":"Lorem blah blah 3.1"},{"id":"0302","name":"","message":"Lorem blah blah 3.2"},{"id":"0303","name":"","message":"Lorem blah blah 3.3"},{"id":"0304","name":"","message":"Lorem blah blah 3.4"}]; 
 

 
var o = {} 
 
var result = data.reduce(function(r, el) { 
 
    var e = el.id.slice(0, 2); 
 
    if (!o[e]) { 
 
    o[e] = { 
 
     id: el.id, 
 
     name: el.name, 
 
     message: [] 
 
    } 
 
    r.push(o[e]); 
 
    } 
 
    o[e].message.push(el.message); 
 
    return r; 
 
}, []) 
 

 
console.log(result)

+0

Ahhh Nenad Vracarあなたは私にとっては速すぎます。私は@Blaze Sahlzenのために試したことの真似をしていましたが、ここでは実際の解決策があります。ありがとう。それは素晴らしいです! 完璧な答え。私はまだupvoteすることはできませんが、私ができない場合には、私はあなたを象徴的に投票しています。これは完全に機能しました。 –

+0

うれしい私は助けることができます。 –

+0

私はさらなる助けを求めて来ました。私はまだ別の配列を持っています: 'var data2 = [{" CandidateName ":" Mary "、" relatedId ":[" 0100 "]}、{" CandidateName ":" John "、" relatedId ":[" 0200 " {"0300"}}、{"CandidateName": "Paul"、 "relatedId":["0300"]}] ' であり、このうち{I " 'candidateName'を取得して元の配列 "result"に配列として追加したいとします。 私はdata1.reduceループ内でdata2.forEachループを試しましたが、ハングするようです。 もっと洗練された洗練された方法がありますか? –

1

あなたは、二重ゼロをチェックし、結果セットに新しいグループを追加することができます。

var data = [{ "id": "0100", "name": "name 1", "message": "Lorem blah blah 1" }, { "id": "0101", "name": "", "message": "Lorem blah blah 1.1" }, { "id": "0200", "name": "name 2", "message": "Lorem blah blah 2" }, { "id": "0201", "name": "", "message": "Lorem blah blah 2.1" }, { "id": "0202", "name": "", "message": "Lorem blah blah 2.2" }, { "id": "0300", "name": "name 3", "message": "Lorem blah blah 3" }, { "id": "0301", "name": "", "message": "Lorem blah blah 3.1" }, { "id": "0302", "name": "", "message": "Lorem blah blah 3.2" }, { "id": "0303", "name": "", "message": "Lorem blah blah 3.3" }, { "id": "0304", "name": "", "message": "Lorem blah blah 3.4" }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    var key = a.id.slice(0, 2); 
 
    if (a.id === key + '00') { 
 
     this[key] = { id: a.id, name: a.name, message: [] }; 
 
     grouped.push(this[key]); 
 
    } 
 
    this[key].message.push(a.message); 
 
}, Object.create(null)); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

二重ゼロ問題に関する興味深い点。私はそれを私のコードに含めます。あなたの答えは@Nenad Vracarに非常に近いので、あなたにも信用できます。私はそれを自分のコードの中で動作させることはできないようです。この行で「メッセージが定義されていません」というエラーが表示されます。 this [key] .message.push(a.message); しかし、私はそれが動作するように動作していることを確認してくださいコードスニペットウィンドウです。しかし、二重ゼロ問題を強調してくれてありがとう。 暫定upvote! –

+0

あなたのデータがidでソートされていない可能性があります。これが当てはまる場合、両方の提案は実際には機能しません。 –

関連する問題