首页 > 解决方案 > 将嵌套数字数组的索引映射到字符串数组的索引

问题描述

我正在尝试将数组元素从 foo3.flat() 映射到 foo2 中的元素。例如,如果 foo2 中的第 0 个索引是“address1”,而 foo3 的第 0 个索引是 [1,2,3],则 [1,2,3] 中的所有单个数字都应映射到“address1”。目前,这是 obj 的映射方式。

对象的值

{
  address1: [ 1, 2, 3 ],
  address2: [ 4, 5 ],
  address3: [ 6, 7, 8, 9 ],
  address4: [ 10 ]
}

代码

var foo1 = []

var foo2 = [
  'address1',
  'address2',
  'address3',
  'address4'
]

var foo3 = [
  [1,2,3],
  [4,5],
  [6,7,8,9],
  [10]
]

var foo4 = [
  [11,12,13],
  [14,15],
  [16,17,18,19],
  []
]


var foo5 = [
  [[111,111,111],[222,222,222],[333,333,333]],
  [[444,444,444],[555,555,555]],
  [[666,666,666],[777,777,777],[888,888,888],[999,999,999]],
  []
  
]

var obj = {}

foo2.forEach((key, i) => obj[key] = foo3[i])

foo3 = foo3.flat()
foo4 = foo4.flat()
foo5 = foo5.flat()


for(var i=0;i <foo3.length;i++) {
  
  foo1.push({
    key1:'',
    key2:foo3[i],
    key3:foo4[i],
    key4: foo5[i]
  })
}

console.log(foo1)

结果

[
  { key1: '', key2: 1, key3: 11, key4: [ 111, 111, 111 ] },
  { key1: '', key2: 2, key3: 12, key4: [ 222, 222, 222 ] },
  { key1: '', key2: 3, key3: 13, key4: [ 333, 333, 333 ] },
  { key1: '', key2: 4, key3: 14, key4: [ 444, 444, 444 ] },
  { key1: '', key2: 5, key3: 15, key4: [ 555, 555, 555 ] },
  { key1: '', key2: 6, key3: 16, key4: [ 666, 666, 666 ] },
  { key1: '', key2: 7, key3: 17, key4: [ 777, 777, 777 ] },
  { key1: '', key2: 8, key3: 18, key4: [ 888, 888, 888 ] },
  { key1: '', key2: 9, key3: 19, key4: [ 999, 999, 999 ] },
  { key1: '', key2: 10, key3: undefined, key4: undefined }
]

预期结果

[
  { key1: 'address1', key2: 1, key3: 11, key4: [ 111, 111, 111 ] },
  { key1: 'address1', key2: 2, key3: 12, key4: [ 222, 222, 222 ] },
  { key1: 'address1', key2: 3, key3: 13, key4: [ 333, 333, 333 ] },
  { key1: 'address2', key2: 4, key3: 14, key4: [ 444, 444, 444 ] },
  { key1: 'address2', key2: 5, key3: 15, key4: [ 555, 555, 555 ] },
  { key1: 'address3', key2: 6, key3: 16, key4: [ 666, 666, 666 ] },
  { key1: 'address3', key2: 7, key3: 17, key4: [ 777, 777, 777 ] },
  { key1: 'address3', key2: 8, key3: 18, key4: [ 888, 888, 888 ] },
  { key1: 'address3', key2: 9, key3: 19, key4: [ 999, 999, 999 ] },
  { key1: 'address4', key2: 10, key3: undefined, key4: undefined }
]

var foo1 = []

var foo2 = [
  'address1',
  'address2',
  'address3',
  'address4'
]

var foo3 = [
  [1, 2, 3],
  [4, 5],
  [6, 7, 8, 9],
  [10]
]

var foo4 = [
  [11, 12, 13],
  [14, 15],
  [16, 17, 18, 19],
  []
]


var foo5 = [
  [
    [111, 111, 111],
    [222, 222, 222],
    [333, 333, 333]
  ],
  [
    [444, 444, 444],
    [555, 555, 555]
  ],
  [
    [666, 666, 666],
    [777, 777, 777],
    [888, 888, 888],
    [999, 999, 999]
  ],
  []

]

var obj = {}

foo2.forEach((key, i) => obj[key] = foo3[i])

foo3 = foo3.flat()
foo4 = foo4.flat()
foo5 = foo5.flat()


for (var i = 0; i < foo3.length; i++) {

  foo1.push({
    key1: '',
    key2: foo3[i],
    key3: foo4[i],
    key4: foo5[i]
  })
}

console.log(foo1)

标签: javascriptarraysobject

解决方案


这是产生预期结果的代码:

var foo1 = [];

var foo2 = [
  'address1',
  'address2',
  'address3',
  'address4',
];

var foo3 = [
  [1, 2, 3],
  [4, 5],
  [6, 7, 8, 9],
  [10],
];

var foo4 = [
  [11, 12, 13],
  [14, 15],
  [16, 17, 18, 19],
  [],
];


var foo5 = [
  [
    [111, 111, 111],
    [222, 222, 222],
    [333, 333, 333]
  ],
  [
    [444, 444, 444],
    [555, 555, 555]
  ],
  [
    [666, 666, 666],
    [777, 777, 777],
    [888, 888, 888],
    [999, 999, 999]
  ],
  [],
];

const map = new Map();

for (let i = 0; i < foo2.length; i++) {
  const maxLength = Math.max(foo3[i].length, foo4[i].length, foo5[i].length);
  for (let j = 0; j < maxLength; j++) {
    map.set('key1', foo2[i]);
    map.set('key2', foo3[i][j]);
    map.set('key3', foo4[i][j]);
    map.set('key4', foo5[i][j]);
    const obj = Object.fromEntries(map);
    foo1.push(obj);
    map.clear();
  }
}

console.log(foo1);


推荐阅读