我只需要删除相同的3位数字组合,但顺序不同,并推入最低值的逻辑。
假设我有以下数组:
var array = [211, 112, 121, 456, 564, 731, 898];
提交后,它将仅推送以下数组:
var array = [112, 456, 731, 898]
因为211、112和121是相同的数字,但是顺序不同,由于它是三者中最低的,它只推了112。 456和564相同。
示例代码很棒,也无法在堆栈溢出中找到它。
答案 0 :(得分:2)
您可以使用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);
答案 1 :(得分:0)
这是我做的方法,..
如果要选择第一个,则将使用另一个Set来跟踪,以查看是否已返回。
编辑:要最小化,可以进行预排序。
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));
答案 2 :(得分:0)
使用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);
答案 3 :(得分:0)
基本上,您想从列表中删除数字的所有排列,请尝试以下操作:
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);
答案 4 :(得分:0)
对于单线和ES6。你可以用这个
Array.from(
new Set(
[211, 112, 121, 456, 564, 731, 898]
.map(x => parseInt(x.toString().split('').sort().join('')))
)
)
答案 5 :(得分:0)
这是我的贡献,非常未经优化和混乱,我知道上面有更简单的方法来解决它。
我做了什么:
.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));