2016-08-16 9 views
1

として残る:分割配列は、ここに見られるように、私は、値として別の配列を持つプロパティがあるオブジェクトのjavascript配列を、持っている一つの項目の配列ではなく文字列

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
] 

私がしようとしていますそれを分割するので、複数の親を持つすべてのオブジェクトは、自身の複製コピーを取得し、各コピーは異なる親を持ちます。

var updateddata = JSON.parse(JSON.stringify(data)); 

for (var i = 0; i < updateddata[i].parent.length; i++) { 
    while (updateddata[i].parent.length > 1) { 
     updateddata.push({ 
     id: updateddata[i].id, 
     parent: updateddata[i].parent[0] 
    }) 
updateddata[i].parent.shift() 
} 
} 

そして、それはconsole.log(JSON.stringify(updateddata))をやったときに、私は他の人とは違って、最初の2つのエントリが親として1つのエントリを持つ配列を持っていることを見ることができるという事実を除いて、完璧に動作しますが、私は今のところこれを行ってきましたアレイの外側すでにである:

これは、updateddataためconsole.logです:

[ 
{"id":1,"parent":[4]}, 
{"id":2,"parent":[8]}, 
{"id":1,"parent":1}, 
{"id":1,"parent":2}, 
{"id":1,"parent":3}, 
{"id":2,"parent":5}, 
{"id":2,"parent":6}, 
{"id":2,"parent":7} 
] 

私はまた、値の.toString()を使用しようとしましたが、それはどんな違いがありませんでした。

どうすれば解決できますか?

+1

あなたがすべき事は少し良くなりますあなたのwhileループは長さが0かどうかチェックしていないので0までループしますあなたは最後のものを読んでいません。 – AxelH

答えて

1

あなたは私たちは、アレイ横断するforループを使用することができます。ここ

var data = [{ 
 
    id: 1, 
 
    parent: [1, 2, 3, 4] 
 
}, { 
 
    id: 2, 
 
    parent: [5, 6, 7, 8] 
 
}] 
 

 
var result = data.reduce(function(r, ar) { 
 
    ar.parent.forEach(function(e) { 
 
    r.push({id: ar.id, parent: e}); 
 
    }); 
 
    return r; 
 
}, []); 
 

 
console.log(result)

+0

ありがとうございます。それはうまくいく。私はこの答えを受け入れることに決めました。使用する方法は面白く、私はそれを知らなかったので、私はそれについて読んでいきます。 –

1

これは必要なものですか?

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
] 

var updatedData = []; 

data.forEach((obj) => { 
    if (obj.parent.length > 1) { 
    obj.parent.forEach((value) => { 
     updatedData.push({ 
     id: obj.id, 
     parent: [value] 
     }); 
    }) 
    } 
}); 
+0

ありがとうございます。配列の外側に値を入れたいので、代わりに 'parent:value'にする必要がありますが、これはかなりです。 –

1

reduce()forEach()ループでこれを行うことができます:

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
]; 
var result = []; 
for(var i=0; i<data.length; i++) { 
    var obj = data[i]; 
    for(var j=0;j<obj.parent.length; j++) { 
     result.push({id: obj["id"], parent: obj.parent[j]}); 
    } 
} 
console.log(result); 

なりますが期待される結果を印刷する。

+0

ありがとう、それは正常に動作します。 –

1

あなたが何かの作業を持っていたので、私はまだ正確にあなたのコードを使用するための答えを書きます:もちろん

for (var i = 0; i < updateddata[i].parent.length; i++) { 
    while (updateddata[i].parent.length > 0) { // Here you should read the last one 
     updateddata.push({ 
     id: updateddata[i].id, 
     parent: updateddata[i].parent[0] 
     }) 
     updateddata[i].parent.shift() 
    } 
} 

を、これは最初に空の配列を維持します。 2つのソリューション、治療後または長さ= 1のときに親配列を値に変更する

1

concat、およびmapはもっと宣言的な解決策をもたらします。

var data = [ 
 
    { id: 1, parent: [1,2,3,4] }, 
 
    { id: 2, parent: [5,6,7,8] } 
 
] 
 

 
let result = data.reduce((acc, {id, parent}) => 
 
    [...acc, ...parent.map(x => ({id, parent:x}))], []) 
 
    
 
console.log(result)

あなたが先に時間の出力データの形状を定義した場合、それはまだ

var data = [ 
 
    { id: 1, parent: [1,2,3,4] }, 
 
    { id: 2, parent: [5,6,7,8] } 
 
] 
 

 
let shape = id => parent => ({id, parent}) 
 

 
let result = data.reduce((acc, {id, parent}) => 
 
    [...acc, ...parent.map(shape(id))], []) 
 
    
 
console.log(result)

関連する問題