2017-09-22 12 views
0

に項目を押す:は、私はオブジェクトの配列を持つオブジェクトのキーの値の配列

[ 
{ pair_id: 1, exchange_pair_id: 183 }, 
{ pair_id: 1, exchange_pair_id: 2}, 
... 
] 

私は

[ 
{ pair_id: 1, exchange_pair_id: [183, 2] }, 
... 
] 

としてこのアレイを再構築したいここで私が書いたコード(コードであります)とにかく私は望ましい結果に最も近いをもたらします:

になり
var array = []; 

rows.forEach(function(row) { 
    var obj = {}; 
    obj.pair_id = [row.pair_id]; 
    obj.exchange_pair_id = [row.exchange_pair_id] 
    array.push(obj); 
}); 

[ 
{ pair_id: 1, exchange_pair_id: [183] }, 
{ pair_id: 1, exchange_pair_id: [2] }, 
... 
] 

これは単純な解決策では非常に単純な問題のようですが、私は頭を悩ましてしまい、それを理解できません。

+1

あなたはobj.exchange_pair_id = [row.exchange_pair_id] '類似したペアのIDをチェックし、配列に値をラップではなく、ある'で行うすべて。最も簡単な考え方は、配列内のキーを使用することです。 – timmyRS

+0

if単純なif文if pair_id:== 1、等、私の意見では十分だろう –

答えて

4

は、このソリューションをお試しください。私はArray#forEachで配列を繰り返し、Array#find関数を使用してによってgroupedArrayの要素を見つけようとします。要素が見つかった場合は、exchange_pair_idをその要素の配列にプッシュします。そうでなければ、項目の値に従って配列内に新しい項目を作成します。

const array = [ 
 
    { pair_id: 1, exchange_pair_id: 183 }, 
 
    { pair_id: 1, exchange_pair_id: 2}, 
 
    { pair_id: 2, exchange_pair_id: 7}, 
 
    { pair_id: 3, exchange_pair_id: 988}, 
 
    { pair_id: 2, exchange_pair_id: 8}, 
 
    { pair_id: 3, exchange_pair_id: 98} 
 
]; 
 

 
const groupedArray = []; 
 

 
array.forEach(item => { 
 
    
 
    const found = groupedArray.find(x => x.pair_id === item.pair_id); 
 
    
 
    if(found) { 
 
    found.exchange_pair_id.push(item.exchange_pair_id); 
 
    } else { 
 
    groupedArray.push({ pair_id: item.pair_id, exchange_pair_id: [item.exchange_pair_id]}); 
 
    } 
 
    
 
}); 
 

 
console.log(groupedArray);

+0

ありがとう、優秀な答え;さらにfind()を研究します。私は実際には、より良いMySQLクエリを実行することでこのステップをスキップすることができると感じています。このステップをスキップする方法であるかもしれません。本当に感謝。 https://stackoverflow.com/questions/46365942/mysql-select-all-values-which-share-this-fields-value – Nick

0

これを試してみてください:

var arr1 = [ 
 
    { pair_id: 1, exchange_pair_id: 183 }, 
 
    { pair_id: 1, exchange_pair_id: 2}, 
 
]; 
 

 
var arr2 = []; 
 
arr1.forEach(el => { 
 
    var obj = arr2.find(it => it.pair_id === el.pair_id); 
 
    if (!obj) { 
 
     el.exchange_pair_id = [el.exchange_pair_id]; 
 
     arr2.push(el); 
 
    } else { 
 
     obj.exchange_pair_id.push(el.exchange_pair_id); 
 
    } 
 
}); 
 

 
console.log(arr2);

+0

これは望ましい出力を生成しません! –

0

あなたが近くにいる、あなただけの以前の結果があるかどうか確認する必要があります。地図を使用すると、アイテムが表示されるたびにfindのようなものを使ってリストを調べるよりも時間がかかります。あなたが何をしようとして

var results = new Map(); 

rows.forEach(function(row) { 
    previous_result = results.get(row.pair_id) 
    if (previous_result != null) { 
     previous_result.exchange_pair_id.push(row.exchange_pair_id); 
    } else { 
     var obj = {}; 
     obj.pair_id = row.pair_id; 
     obj.exchange_pair_id = [row.exchange_pair_id] 
     results.set(row.pair_id, obj); 
    } 
}); 

Array.from(results.values()) 
+0

この解決策はうまくいきませんでした。地図{1 => {ペアID:[1]、exchange_pair_id:[183]​​} ... – Nick

+0

@Nickお手伝いします。私はローカルでテストしたところ、うまくいくように見えました。何があなたのために働かなかったのですか? –

0

は、集約または減少であるので、私はここにArray.reduce()を使用すると思います。このように、順番に各要素を取り、要素の新しいセットを構築:

const rows = [ 
 
{ pair_id: 1, exchange_pair_id: 183 }, 
 
{ pair_id: 1, exchange_pair_id: 2}, 
 
{ pair_id: 4, exchange_pair_id: 6} 
 
]; 
 

 
const result = rows.reduce(function(aggregate, nextElement) { 
 
    const pair_id = nextElement.pair_id;   
 
    
 
    //create a new row in the aggregate if one doesn't exist 
 
    let aggregatedRow = aggregate.find(r => r.pair_id === pair_id);  
 
    if (!aggregatedRow) { 
 
     aggregatedRow = { pair_id, exchange_pair_id: [] }; 
 
     aggregate.push(aggregatedRow); 
 
    } 
 
    //add the new exchange pair id to the aggregate row  
 
    aggregatedRow.exchange_pair_id.push(nextElement.exchange_pair_id); 
 
     
 
    return aggregate; 
 
     
 
}, []); //start with an empty array 
 

 
console.log(result);

0

あなたは同じpair_idのハッシュテーブルを取ることができます。

var array = [{ pair_id: 1, exchange_pair_id: 183 }, { pair_id: 1, exchange_pair_id: 2}], 
 
    hash = Object.create(null), 
 
    result = array.reduce(function (r, o) { 
 
     if (!hash[o.pair_id]) { 
 
      hash[o.pair_id] = []; 
 
      r.push({ pair_id: o.pair_id, exchange_pair_id: hash[o.pair_id] }); 
 
     } 
 
     hash[o.pair_id].push(o.exchange_pair_id); 
 
     return r; 
 
    }, []); 
 

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

関連する問題