如何仅允许一个数组被推入数组一次



我有一个数组,其中包含其他数组。

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。我想以某种方式设置一个条件:

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

您可以使用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)

您可以使用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);

接受的答案不尊重在数组中只有两个值的特殊情况,并且数组必须在不同的数量中对两个值进行检查,例如

[1, 1, 2]

[1, 2, 2]

是不同的数组。

对于工作解决方案,我建议使用Map并计算第一个数组的相同值的出现,然后减去另一个arrray的值计数。

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

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

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

最新更新