将数组中的所有重复值推送到新数组

时间:2021-02-18 05:52:02

标签: javascript

我正在尝试从以下数组中获取结果 [1,1,1,1,2,2,20,20]。

基本上,我试图将所有重复值推送到新数组中,但是没有得到想要的结果。请求你帮忙。

const array = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

const dupArray = (arr) => {
  let newArray = array.sort();
  let filteredArray = [];
  for (y = 0; y < newArray.length; y++) {
    for (i = y + 1; i < newArray.length; i++) {
      if (newArray[y] === newArray[i]) {
        filteredArray.push(newArray[i]);
      }
    }
  }

  return filteredArray
};

console.log(dupArray());

5 个答案:

答案 0 :(得分:0)

我认为预期的结果应该是:[1, 1, 1, 1, 2, 2, 2, 20, 20]

代码:

const array = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20]

const dupArray = (arr) => Object
  .entries(arr.reduce((a, c) => (a[c] = ++a[c] || 1, a), {}))
  .filter(e => e[1] > 1)
  .map(e => Array(e[1]).fill(+e[0]))
  .flat(1)

console.log(dupArray(array))

答案 1 :(得分:0)

首先,我在 array.sort() 中传入了一个自定义排序函数,用于递增序列。 使用标志 hasDuplicates 来检查它之前是否有重复项,如果没有,则将该元素两次附加到数组中。 最后,为了避免重新处理元素,我将 y 设置为 i-1

就效率而言,这应该是好的,因为数组只线性遍历一次。

const array = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

const dupArray = (arr) => {
  let newArray = array.sort((a, b) => a - b);  
  let filteredArray = [];
  for (y = 0; y < newArray.length; y++) {
    let hasDuplicates = false;                
    for (i = y + 1; i < newArray.length; i++) {
      if (newArray[y] === newArray[i]) {    
        filteredArray.push(newArray[i]); 
        if(!hasDuplicates) {               
          filteredArray.push(newArray[i]);
          hasDuplicates = true;
        }
      } else {
        y = i - 1;
        break;
      }
    }
  }

  return filteredArray
};

console.log(dupArray());

答案 2 :(得分:0)

我希望这对你有用,只是重复数组。

String prevStr = origList.get(0).substring(1,4);
for (int i = 0; i < A.size(); i++) {
  if(prevStr.equals(origList.get(i).substring(1,4)) {
    //add it to an ArrayList
  }else{
    //create new list
  }
  prevStr = origList.get(i).substring(1,4);
}

答案 3 :(得分:0)

您可以使用简单的过滤功能

const array = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

const dupArray = (arr) => arr.filter( x => 
  arr.filter(y => y === x).length > 1
).sort()

console.log(dupArray(array))

逻辑如下

  1. 从数组过滤器中,对于每个元素 y 如果您对 y 元素进行过滤,则数组的大小应大于 1
  2. 对数组进行排序

答案 4 :(得分:0)

这里是排序数组的两种解决方案。我相信所需的输出应该是 [1,1,1,1,2,2,2,20,20]

const array = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

//First solution
const dupArray = (arr) => {
  arr = arr.sort((a,b) => a-b);
  let filteredArray = [];
  let currentElement = null;
  for(let i = 0; i < arr.length; i ++){
    if(arr[i] === currentElement){
      filteredArray.push(arr[i]);
    }else{
      currentElement = arr[i];
      if(arr[i] === arr[i+1]){
        filteredArray.push(arr[i]);
      }
    }
  }
  return filteredArray;
};

//Second solution
const dupArray2 = (arr) => {
  arr = arr.sort((a,b) => a-b);
  for(let i = 0; i < arr.length; i ++){
    if(arr[i] != arr[i-1] && arr[i] != arr[i+1]){
      arr.splice(i,1);
      i -= 1;
    }
  }
  return arr;
};
console.log(dupArray(array));
console.log(dupArray2(array));