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

时间:2018-07-09 15:02:51

标签: javascript arrays sorting

我只需要删除相同的3位数字组合,但顺序不同,并推入最低值的逻辑。

假设我有以下数组:

var array = [211, 112, 121, 456, 564, 731, 898];

提交后,它将仅推送以下数组:

var array = [112, 456, 731, 898]

因为211、112和121是相同的数字,但是顺序不同,由于它是三者中最低的,它只推了112。 456和564相同。

示例代码很棒,也无法在堆栈溢出中找到它。

6 个答案:

答案 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()
  • 获取每个字符串索引的总和,并使用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));