2017-02-16 67 views
0

试图操纵这个:变换数组/对象:如何在for循环中创建动态命名的对象?

input = [ 
[ ['a','b'], ['c','d'], ['e','f'] ], 
[ ['g','h'], ['i','j'], ] 
] 

output = [ 
    {a: 'b', c: 'd', e: 'f'}, 
    {g: 'h', i: 'j'}, 
] 

这是我到目前为止有:

function transform(array) { 
    result = []; 
    for (var i=0; i<array.length; i++){ 
    for (var j=0; j<array[i].length; j++){ 

    // How can I create an object here? 

    object.array[i][j][0] = array[i][j][1]; 
    } 
    } 
return result; 
} 

我想解决这个作为编码的挑战,所以我不要并不一定需要答案,但我不确定如何继续。由于内部有一对字符串的数组数量不统一(例如,输入数组中的第一组数组有3组,而第二组数组有2组,所以我认为我需要在每个循环内动态创建对象我可以在最后添加到结果数组中,我该如何做到这一点?

我不认为我应该使用任何类型的fancier /高阶函数,目标是建立我的熟悉度与基本面。

+0

'var obj = {}; for(...){obj [key] = value; }'。请参阅[是否可以将动态命名的属性添加到JavaScript对象?](http://stackoverflow.com/q/1184123/218196) –

+0

我建议你工作的功能只做一个转换,所以嵌套循环不要不妨碍理解。写一个将[['key1','value1'],['key2','value2']]'转换为'{key1:'value1',key2:'value2'}'的变量。 https://stackoverflow.com/questions/695050/how-do-i-add-a-property-to-a-javascript-object-using-a-variable-as-the-name可能会有所帮助。 – Ryan

+0

@FelixKling如何解决这个问题,因为我需要能够创建这些对象x次数和x是多种多样的? –

回答

0
Input.reduce((memo,num) => { 
    memo[num[0]]=num[1]; 
    return memo; 
},{}) 
+1

只有代码答案没有用处。请*解释*您的解决方案,以便其他人可以学习。我确定OP不知道'reduce'是什么。 –

+1

这个答案和凌青萌的问题一样。 – RobG

0
input = [ 
[ ['a','b'], ['c','d'], ['e','f'] ], 
[ ['g','h'], ['i','j'], ] 
] 

var output = [ input[0].reduce((memo,num) => { memo[num[0]]=num[1];return memo;},{})] 

的console.log(JSON.stringify(输出))

[{ “一个”: “B”, “C”: “d”, “E”: “F”}]

+0

只有代码答案没有用处。请*解释*您的解决方案,以便其他人可以学习。 –

+0

更好的是,作为可运行的代码片段发布,以显示它的工作原理(我认为你会发现它不会)。 – RobG

1

可以使用减少处理内外阵列,例如

var input = [ 
 
      [['a','b'], ['c','d'],['e','f'] ], 
 
      [['g','h'], ['i','j'],] 
 
      ]; 
 

 
// For each outer array 
 
var result = input.reduce(function(acc, a){ 
 

 
    // Create an object from the inner arrays 
 
    acc.push(a.reduce(function(acc, a) { 
 
    acc[a[0]] = a[1]; 
 
    return acc; 
 
    },{})); 
 
    return acc; 
 
}, []); 
 

 
console.log('With reduce\n'); 
 
console.log(result); 
 

 
// Same algorithm using for loops: 
 
var result2 = []; 
 

 
// For each outer array 
 
for (var i=0, iLen=input.length; i<iLen; i++) { 
 
    var acc = {}; 
 
    var a = input[i]; 
 

 
    // Loop over the inner arrays to build an object, 
 
    // then push into result array 
 
    for (var j=0, jLen=a.length; j<jLen; j++) { 
 
    var b = a[j] 
 
    acc[b[0]] = b[1]; 
 
    } 
 
    result2.push(acc); 
 
} 
 
console.log('\nWith loops') 
 
console.log(result2);

+0

有没有办法做到这一点,而不减少? –

+0

@ FaiqueMoqeet - 是的,只需将它替换为* for *循环即可。它实际上没有更多的代码。 – RobG

0

可以使用嵌套for..of循环遍历每个内阵列,在完成在索引1在索引0处创建对象,设置属性元素,值到元件,推对象阵列嵌套0​​环

let input = [ 
 
    [ 
 
    ['a', 'b'], 
 
    ['c', 'd'], 
 
    ['e', 'f'] 
 
    ], 
 
    [ 
 
    ['g', 'h'], 
 
    ['i', 'j'] 
 
    ] 
 
]; 
 

 
let output = []; 
 

 
for (let arr of input) { 
 
    let o = {}; 
 
    for (let [key, value] of arr) { 
 
    o[key] = value; 
 
    } 
 
    output.push(o); 
 
} 
 

 
console.log(output);