我只需要删除相同组合的逻辑——3位数字,但顺序不同,然后推送最低值。
假设我有以下数组:
var array = [211, 112, 121, 456, 564, 731, 898];
提交时,它只会推送以下数组:
var array = [112, 456, 731, 898]
由于,211112&121是相同的数字,但顺序不同,它只推了112,因为它是三个中最低的。与456&564.
一个示例代码会很好,在堆栈溢出上也找不到它。
您可以使用Map
来收集结果数组的最小值。
这适用于未排序的数据。
var array = [211, 112, 121, 456, 564, 731, 898],
result = Array.from(array.reduce((map, value) => {
var key = value.toString().split('').sort().join(''),
last = map.get(key);
return map.set(key, last < value ? last : value);
}, new Map).values());
console.log(result);
基本上,如果你想从列表中删除一个数字的所有排列,请尝试以下操作:
let array = [211, 112, 121, 456, 564, 731, 898];
array.sort();
var result = [];
let set = new Set();
array.forEach((a)=>{
let temp = a.toString().split('').sort().join();
if(set.has(temp))
return;
set.add(temp);
result.push(a);
});
console.log(result);
reduce
:的简单解决方案
var array = [211, 112, 121, 456, 564, 731, 898];
var result = array.sort().reduce((all, item) => {
var el = Number(String(item).split('').sort().join(''));
if (all.indexOf(el) === -1) all.push(item)
return all;
}, []);
console.log(result);
这是我的贡献,非常未优化和混乱,我知道上面有更容易的方法来解决它。
我所做的:
- 在数组上迭代
- 转换数字
.toString()
- 获取每个字符串索引的总和,并使用
sum
和index
创建一个对象 - 如果元素具有相同的数字但位于不同的位置,则总和将保持不变
- 稍后,删除了对象的重复项
- 返回新数组
let array = [211, 112, 121, 456, 564, 731, 898];
function removeDuplicates(myArr, prop) {
return myArr.filter((obj, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
});
}
function removeSimilar(arr) {
let arrSums = [];
let finalArray = [];
arr.forEach((el, i) => {
let numStr = el.toString();
let sum = 0;
for (let i = 0; i < numStr.length; i++) {
sum += parseInt(numStr[i]);
}
arrSums.push({
sum: sum,
index: i
});
});
arrSums = removeDuplicates(arrSums, "sum");
arrSums.forEach(({index}) => {
finalArray.push(arr[index]);
});
return finalArray;
}
console.log(removeSimilar(array));
对于一个liner和ES6。你可以使用这个
Array.from(
new Set(
[211, 112, 121, 456, 564, 731, 898]
.map(x => parseInt(x.toString().split('').sort().join('')))
)
)
以下是我的操作方法,。。
如果你想选择第一个,这将使用另一个集合来跟踪,看看它是否已返回。
edit:为了取最小的,预排序可以做到这一点。
const array = [211, 112, 121, 456, 564, 731, 898];
function deDup(arr) {
const a = arr.sort((a,b) => a -b);
const got = new Set();
const mapped = array.map(m => m.toString().split('').sort().join(''));
const ret = [];
mapped.forEach((v, ix) => {
if (got.has(v)) return;
got.add(v);
ret.push(a[ix]);
});
return ret;
}
console.log(deDup(array));