javascript - 将嵌套数字数组的索引映射到字符串数组的索引
问题描述
我正在尝试将数组元素从 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)
解决方案
这是产生预期结果的代码:
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);
推荐阅读
- react-native - 组件不能包含子组件。如果要在图像顶部呈现内容,请考虑使用
零件 - c# - 计算数组的非空元素 - LINQ 性能问题
- signal-processing - 我们可以在 ltspice 中回放 .wav 文件时执行暂停操作吗?
- mongodb - 如何在 kubernetes 之外的 statefulset 中公开 mongodb
- c# - 如何让函数返回两种不同类型的变量?
- c++ - SteamVR 覆盖控制器输入?
- javascript - 如何锁定范围组中的多个单元格,Excel - Web AddIns Office.js API
- c# - 通过 MEF 导入在子类中设置继承的属性
- amazon-web-services - 在私有子网中部署 lambda。创建 Lambda 函数时出错 (1):ValidationException 状态码:400,请求 id
- amazon-web-services - Aws 组织 - 将会员帐户移交给其他方