2017-08-29 7 views
-1

私はアルゴリズムを使ってオブジェクトを配列に変換しています。最後に変換されたオブジェクトが配列内の前のオブジェクトを上書きするとき。これはループ内の配列にオブジェクトを追加するとオブジェクトが上書きされます

[ 
    {firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"}, 
    {firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"} 
]; 

私がログインすると

[ 
    {firstName: "Joe", lastName: "Blow", age: 42, role: "clerk"} 
    {firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"} 
]; 

代わりの取得:

let array = [ 
    [ 
     ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'] 
    ], 
    [ 
     ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager'] 
    ] 
]; 

function transformEmployeeData(array) { 
    let obj = {}; 
    for(let i in array) { 
     for(let j in array[i]) { 
      obj[array[i][j][0]] = array[i][j][1]; 
     } 
     array.splice(i,1,obj); 
    } 
    return array; 
} 

let run = transformEmployeeData(array); 

私は出力として、この結果を得るために期待しています:

この

は私のコードですobj、私は期待される結果を得る。配列に追加すると、前の結果が上書きされます。

+0

デュープターゲットを参照してくださいを操作しないようにしてください。メソッドの1つのレベルをネストする必要があるのは、オブジェクトの配列が必要なためです。 – Cerbrus

答えて

1

基本的に同じオブジェクトを繰り返し使用し、参照を保持するため、最後の値を使用します。

空のオブジェクトを含むループごとにobjを初期化できます。

この結果、元の配列に変更を加えることなく、新しい配列を使用することができます。

Why is using “for…in” with array iteration a bad idea?の代わりに、for ... inの代わりにインデックスを使用してカウントアップしてもよいでしょう。

var array = [ 
 
    [ 
 
    ['firstName', 'Joe'], 
 
    ['lastName', 'Blow'], 
 
    ['age', 42], 
 
    ['role', 'clerk'] 
 
    ], 
 
    [ 
 
    ['firstName', 'Mary'], 
 
    ['lastName', 'Jenkins'], 
 
    ['age', 36], 
 
    ['role', 'manager'] 
 
    ] 
 
]; 
 

 
function transformEmployeeData(array) { 
 
    var i, j, temp = []; 
 
    for (i = 0; i < array.length; i++) { 
 
    let obj = {}; 
 
    for (j = 0; j < array[i].length; j++) { 
 
     obj[array[i][j][0]] = array[i][j][1]; 
 
    } 
 
    temp.push(obj); 
 
    } 
 
    return temp; 
 
} 
 
let run = transformEmployeeData(array); 
 

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

Object.assignspread syntax ...と簡潔なバージョン。新しい配列にpushspliceを交換し、代わりに新しいものを返さない理由

const getKeyValueArray = array => 
 
     array.map(a => Object.assign(...a.map(([k, v]) => ({ [k]: v })))); 
 

 
var data = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]]; 
 

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

+1

入力配列のパラメータを変更して副作用を引き起こすよりも、新しい変換された配列を返す方が良いでしょうか? –

+0

破壊的な変種が望ましいものではないと仮定してください。 – Cerbrus

+0

右の新しい配列が適しています。 –

1

?あなたがいるときに役立ちます

function transformEmployeeData(array)  { 
    let returnvalue = []; 
    for(let i in array) { 
    let obj = {}; 
    for(let j in array[i]) { 
     obj[array[i][j][0]]=array[i][j][1]; 
    } 
    returnvalue.push(obj); 
    } 
    return returnvalue; 
} 

希望は、また反復は、予期しない結果、すなわち避けるために、長さを変更するinterated配列「スプライス、プッシュなど」

関連する問題