如何只允许将数组推入数组一次?

时间:2017-12-14 18:12:40

标签: javascript arrays

我有一个数组,其中包含其他已推入的数组。例如:

const Arrays = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3] ];
let myArr = [];

Arrays.map(arr => {
  if(myArr.indexOf(arr)){
   return
  }
  myArr.push(arr)
})

const myArr = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3] ];

在此数组中,您可以看到有两个数组具有相同的数字123。我想以某种方式设定条件说:

如果此阵列已存在,则不要再按任何顺序添加此阵列以防止这种情况发生。因此,当循环中出现这组数字再次出现时,它将跳过它。

4 个答案:

答案 0 :(得分:5)

您可以使用some()every()方法检查push()之前是否已存在相同的数组。



const myArr = [ [1,2,3], [4,5,6], [7,8,9] ];
let input =  [2,1,3]

function check(oldArr, newArr) {
  return oldArr.some(a => {
    return a.length == newArr.length &&
      a.every(e => newArr.includes(e))
  })
}

if(!check(myArr, input)) myArr.push(input)
console.log(myArr)




答案 1 :(得分:2)

您可以使用sorted element with joined创建临时数组,然后按indexOf

进行检查



const myArr = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3],[6,5,4] ];
var newArr = [];
var temp = [];
for(let i in myArr){
  let t = myArr[i].sort().join(",");
  if(temp.indexOf(t) == -1){
    temp.push(t);
    newArr.push(myArr[i]);
  }
}
console.log(newArr);




答案 2 :(得分:1)

接受的答案不尊重特殊情况,其中数组中只有两个值,并且数组必须检查不同计数中的两个值,如

[1, 1, 2]

[1, 2, 2]

是不同的数组。

对于一个有效的解决方案,我建议使用Map并计算第一个数组相同值的出现次数,并减去另一个数组的值的计数。

结果返回检查Map的所有元素是否为零。



function compare(a, b) {
    var map = new Map;
    a.forEach(v => map.set(v, (map.get(v) || 0) + 1));
    b.forEach(v => map.set(v, (map.get(v) || 0) - 1));
    return [...map.values()].every(v => !v);
}

var array = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [2, 1, 3], [1, 1, 2], [1, 2, 2], [2, 1, 1], [2, 1, 2]],
    unique = array.reduce((r, a) => (r.some(b => compare(a, b)) || r.push(a), r), []);

console.log(unique);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 3 :(得分:-1)

一种方法是使用.sort()对它们进行数字排序,然后比较它们。