内循环的javascript问题

时间:2019-02-07 20:13:30

标签: javascript ecmascript-6

我正在尝试循环3个数组并生成一组具有唯一ID的孩子

但是由于某些原因,属性id不能获得唯一值(请参阅控制台结果)

我尝试了各种方式,例如使用forEach,使用closures,使用局部变量。他们都没有工作。

const alpha = [{ name: 'AAA', value: 'a' }, { name: 'BBB', value: 'b' }, { name: 'CCC', value: 'c' }], 
	numeric = [{ name: 'ONE', value: '1' }, { name: 'TWO', value: '2' }, { name: 'THREE', value: '3' }], 
	symbol = [{ name: 'AT', value: '@' }, { name: 'HASH', value: '#' }, { name: 'DOLLAR', value: '$' }];

const result = alpha.map(a => {
  a.children = numeric.map(n => {
    n.children = symbol.map(s => {
      s.id = a.value + n.value + s.value;
      return s;
    });
    n.id = a.value + n.value;
    return n;
  });
  a.id = a.value;
  return a;
})


console.log(result[0].children[0].children[0].id)   // should be "a1@"
console.log(result[1].children[0].children[0].id)   // should be "b1@"
console.log(result[2].children[0].children[0].id)   // should be "c1@"

2 个答案:

答案 0 :(得分:2)

问题在于您正在修改输入对象,因此同一s被多次修改。这就是为什么您只在ID中看到最后alphanumeric的原因-它们最后运行,所以最后一个修改共享库的对象。

要解决此问题,请返回一个带有您ID的 new 对象,并且一切都会很好:

const alpha = [{ name: 'AAA', value: 'a' }, { name: 'BBB', value: 'b' }, { name: 'CCC', value: 'c' }], 
	numeric = [{ name: 'ONE', value: '1' }, { name: 'TWO', value: '2' }, { name: 'THREE', value: '3' }], 
	symbol = [{ name: 'AT', value: '@' }, { name: 'HASH', value: '#' }, { name: 'DOLLAR', value: '$' }];

const result = alpha.map(a => {
  a.children = numeric.map(n => {
    n.children = symbol.map(s => {
      return { ...s, id: a.value + n.value + s.value };
    });
    return { ...n, id: a.value + n.value };
  });
  return { ...a, id: a.value };
})


console.log(result[0].children[0].children[0].id)   // should be "a1@"
console.log(result[1].children[0].children[0].id)   // should be "b1@"
console.log(result[2].children[0].children[0].id)   // should be "c1@"

答案 1 :(得分:1)

您多次在数组symbols上进行映射,但是每次都获得对相同对象的引用:

symbol.map(s => {  // s is always a reference to the same set of objects object
   s.id = a.value + n.value + s.value;
   return s;
});

每次看到这些对象之一时,都会覆盖同一对象的<{>> {}属性,因此,当您记录它们时,它们具有相同的ID。

id