2016-09-07 7 views
4

forループを実行して新しいjavascriptオブジェクトを作成し、置換せずに既存のjavascriptオブジェクトに追加しようとしています。子を置換せずにJavascriptオブジェクトに追加

例えば、私は([i]のデータだけ番号を追加する)グループなしで出力としてこれを作成しようとしている[i]をするたびに上書きされています:

{ 
    "group1": { 
     "number1": "data", 
     "number2": "data", 
     "number3": "data" 
    }, 
    "group2": { 
     "number1": "data", 
     "number2": "data" 
    } 
} 

私のループは次のようになります。

var array = [{ 
    "groupName": "group1", 
    "number": "number1", 
    "data": "data" 
}, { 
    "groupName": "group1", 
    "number": "number2", 
    "data": "data" 
}, { 
    "groupName": "group1", 
    "number": "number3", 
    "data": "data" 
}, { 
    "groupName": "group2", 
    "number": "number1", 
    "data": "data" 
}, { 
    "groupName": "group2", 
    "number": "number2", 
    "data": "data" 
}] 

var groupLinks = {}; 

for(i = 0; i < array.length; i++) { 

    groupLinks[array[i].groupName] = { 
     [array[i].number]: array[i].data 

} 

このコードでわかるように、私のループは毎回 "group1"と "group2"を置き換えるだけです。

+0

'number1'、' number2'などのものはすべて維持不能に見えます。 '{group1:{numbers:['data'、 'data'、 'data']}}'のような 'numbers'の配列だけではないのですか? – Phil

+0

@Philこれは、データベースに配置するために必要な構造です(Firebase) – James

答えて

5

これは私がこれに近づいて行くだろうかです:

ここ

var array = [{ 
 
    "groupName": "group1", 
 
    "number": "number1", 
 
    "data": "data" 
 
}, { 
 
    "groupName": "group1", 
 
    "number": "number2", 
 
    "data": "data" 
 
}, { 
 
    "groupName": "group1", 
 
    "number": "number3", 
 
    "data": "data" 
 
}, { 
 
    "groupName": "group2", 
 
    "number": "number1", 
 
    "data": "data" 
 
}, { 
 
    "groupName": "group2", 
 
    "number": "number2", 
 
    "data": "data" 
 
}]; 
 

 
var groupLinks = {}; 
 

 
array.forEach(
 
    function (element) 
 
    { 
 
     var groupName = element.groupName; 
 
     (groupLinks[groupName] = groupLinks[groupName] || {}) 
 
      [element.number] = element.data; 
 

 
    } 
 
); 
 

 
console.log(groupLinks);

私は各繰り返しで、既存のgroupLinks[groupName]を上書きし、何も存在しない場合、新しいグループを作成するには||演算子を使用配列要素をループするにはforEach構造を使用しました。

+0

The ||非常に賢いです。私はなぜそれが動作するのかについて私の頭を包み込みようとしています。それは特別な意味を持っていますか? – Darkrum

+0

@Darkrum 'A || Bは、真実であれば「A」を、そうでなければ「B」をとることを意味します。 –

+1

ああ、何が起こっているのか分かります。そのインデントは、セミコロンの不足をpluseします。 – Darkrum

0

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

var array = [{ 
     "groupName": "group1", 
     "number": "number1", 
     "data": "data" 
    }, { 
     "groupName": "group1", 
     "number": "number2", 
     "data": "data" 
    }, { 
     "groupName": "group1", 
     "number": "number3", 
     "data": "data" 
    }, { 
     "groupName": "group2", 
     "number": "number1", 
     "data": "data" 
    }, { 
     "groupName": "group2", 
     "number": "number2", 
     "data": "data" 
    }] 

    var groupLinks = {}; 

    array.forEach(function(el){ 
     if(groupLinks[el.groupName]){ 
     groupLinks[el.groupName][el.number] = el.data 
     } 
     else{ 
     groupLinks[el.groupName] = {}; 
     groupLinks[el.groupName][el.number] = el.data 
     } 

    }); 

    console.log(groupLinks); 
0

をあなたは少しES2015を恐れていないなら、これはあなたが

let array = [{"groupName":"group1","number":"number1","data":"data"},{"groupName":"group1","number":"number2","data":"data"},{"groupName":"group1","number":"number3","data":"data"},{"groupName":"group2","number":"number1","data":"data"},{"groupName":"group2","number":"number2","data":"data"}]; 
 

 
let groupLinks = array.reduce((gl, group) => { 
 
    gl[group.groupName] = Object.assign({ 
 
     [group.number]: group.data 
 
    }, gl[group.groupName]); 
 
    return gl; 
 
}, Object.create(null)); 
 

 
console.log(groupLinks);

0

これを試してみてくださいために働く必要があります仕事を減らす:

var groupLinks = {}; 

    for(i = 0; i < array.length; i++) { 
     var groupLinks2 = groupLinks[array[i].groupName]; 
     if(!groupLinks2){ 
      groupLinks2 ={}; 
      var a = array[i].number; 
      groupLinks2[a] = array[i].data; 
     }else{ 
     var a = array[i].number; 
     groupLinks2[a] = array[i].data; 
     } 
     groupLinks[array[i].groupName] = groupLinks2; 

    } 
関連する問題