2017-08-29 59 views
-1

我正在研究将数组转换为对象的算法。当最后一个变换对象覆盖数组中的前一个对象时。将对象覆盖时将其添加到循环内的数组中

这是我的代码:

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); 

我希望得到这样的结果作为输出:

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

而不是得到这个

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

当我登录了该obj,我得到了预期的结果。当我将它添加到数组中时,它只是覆盖以前的结果。

+0

见欺骗目标。你只需要将方法嵌套到一个层次上,因为你需要一个对象数组。 – Cerbrus

回答

1

基本上你一遍又一遍地使用同一个对象并取最后一个值,因为它保留了引用。

您可以使用空对象为每个循环初始化obj

对于结果,您可以使用新的数组,而不会改变原始数组。

只是另一个提示,对于迭代数组,您可以更好地使用索引并对其进行计数,而不是for ... in语法:Why is using “for…in” with array iteration a bad idea?

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 ...

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

为什么不更换splicepush到一个新的数组,并返回新的呢?

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阵列改变长度,以避免意外的结果,即“剪,推等”

相关问题