Javascript数组,删除相同的组合数字,但顺序不同



我只需要删除相同组合的逻辑——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()
  • 获取每个字符串索引的总和,并使用sumindex创建一个对象
  • 如果元素具有相同的数字但位于不同的位置,则总和将保持不变
  • 稍后,删除了对象的重复项
  • 返回新数组

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));

最新更新