我需要遍历n个具有n个项目的数组,找到每个数组中的匹配项,使用这些项目创建一个新数组,如果任何数组都没有项目匹配项,则对于新数组中不匹配的每个数组,这将是未定义的。
我可以用 2 个数组来做到这一点,但正在寻找有关如何为任何数字执行此操作的建议。我没有必要找你来编码,只是一些关于如何解决问题的建议
const one = [[1,2,3,4,5],[3,4,5,6,7,8], [3,4,5,9,10]]
结果应该是这样的
[[1,undefined,undefined], [2,undefined,undefined], [3,3,3],[4,4,4],[5,5,5], [undefined,6,undefined], [undefined, 7,undefined], [undefined, 8, undefined],[undefined,undefined,9], [undefined,undefined,10]]
你可以自由地使用Set
s。首先,将每个内部列表转换为一个集合,以便您可以快速检查数字是否在其中。接下来,您可以在所有列表中创建一组所有数字,并针对每个数字,根据它是否包含在之前创建的每个"内部列表集"中来获取所需的列表:
const one = [
[1, 2, 3, 4, 5],
[3, 4, 5, 6, 7, 8],
[3, 4, 5, 9, 10]
];
const sets = one.map(arr => new Set(arr));
const allNumbers = new Set(one.reduce((acc, curr) => {
acc.push(...curr);
return acc;
}, []));
const result = [...allNumbers].map(n => sets.map(s => s.has(n) ? n : undefined));
console.log(result);
权衡是集合列表占用额外的内存(与原始 2-D 数组本身一样多(。如果这是不可接受的,您可以跳过它,并对原始数组中的每个内部列表includes
进行线性时间检查。