Javascript 将数组元素相互组合的最有效方法



我正在尝试将字符串数组与独特的组合组合在一起,例如'Mark|汤姆"但没有"汤姆|马克'

我写了这段代码:

let arr = ['Tom', 'Danny', 'Mark']
let sets = []
for (let i = 0; i < arr.length; i++) {
let others = arr.filter(name => name != arr[i])
others.forEach((other) => {
let newel = arr[i] + '|' + other
let test = newel.split('|')
if (sets.includes(test[1] + '|' + test[0]) || sets.includes(newel)) return
sets.push(newel)
})
}
console.log(sets)

这是遍历每个数组元素,然后从基本数组创建另一个其他元素数组,然后遍历它们(再次迭代(,创建一个组合,检查我们的元素是否有反向组合(如果这是在以前的循环中创建的(,如果没有这样的组合=将其推送到目标数组。

有没有更优雅的方式来完成这项任务?

这个呢:

const arr = ['Tom', 'Danny', 'Mark'];
const sets = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
sets.push(arr[i] + '|' + arr[j]);
}
}
console.log(sets);

您还可以在开始计算之前arr唯一

const arr = [...new Set(['Tom', 'Danny', 'Mark', 'Tom'])]; // ['Tom', 'Danny', 'Mark']

我会让你的数组成为一个集合,这样它最初会像这样删除所有重复项:

new Set(['Tom', 'Danny', 'Mark']);

现在,您可以使用.flatMapith元素与nth元素之前的所有元素配对,.reduce如下所示:

const name_arr = Array.from(new Set(['Tom', 'Danny', 'Mark']));
const res = name_arr.flatMap(
(name, i) => name_arr.slice(i+1).reduce((a, n) => [...a, name+'|'+n],[])
);
console.log(res);

您可以创建一组传递的数组,遍历数组,为每个索引获取该索引之后的数组,并通过其他数组和构建组合进行循环

let arr = ['Tom', 'Danny', 'Mark']
const uniqueCombo = (arr) => {
let newSet = [...new Set(arr)]
return newSet.reduce((op, inp, index) => {
newSet.slice(index + 1,).forEach(v => {
op.push(inp + '|' + v)
})
return op
},[])
}
console.log(uniqueCombo(arr))
console.log(uniqueCombo(['A', 'B', 'A', 'C', 'D']))
console.log(uniqueCombo(['A', 'B', 'A', 'C']))

试试这个。此方法筛选出以前用于将项目推送到数组的索引。

const arr = ['Tom', 'Danny', 'Mark'];
const comb = [];
for (let i = 0; i < arr.length; i++) {
for (j = i + 1; j < arr.length; j++) {
comb.push(arr[i] + '|' + arr[j]);
}
}
console.log(comb);

最新更新