如何仅允许将数组推入另一个数组一次?

4

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

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

在这个数组中,你可以看到有两个数组包含相同的数字集合 1, 23。我想要设置一个条件:

如果这个数组已经存在,则不要再以任何顺序添加此数组,以防止重复发生。这样当它再次出现时,循环就会跳过它。


3
请问您能否提供代码,以便我们可以帮助您修改?您是否能够在尝试中进行编辑并提交代码? - Andrew Lohr
默认情况下,如果两个数组的元素顺序相同,则它们是相等的。您需要开发一种忽略顺序的策略。 - Code-Apprentice
已添加,先生。 - Taylor Austin
@Code-Apprentice 不准确...只有当它们引用同一个对象时它们才相等。 - charlietfl
@Code-Apprentice 能帮我看看这有什么不同吗? [] != [][] !== [] 还有 [[]].indexOf([]) 等于 -1 - charlietfl
显示剩余2条评论
4个回答

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)


谢谢!这个很好用,如果我可以问一下,这个代码是遍历数组并首先检查新数组是否与任何一个数组的长度匹配,如果匹配,那么该数组是否包含所有这些元素,如果是,则返回true?这样理解对吗? - Taylor Austin
1
它开始循环旧数组或在您的情况下是myArr,并且由于其“some”方法,它将在第一次匹配时退出循环,返回true / false。然后,在里面,它首先检查“some”循环中的当前元素是否与“newArr”的长度相同,如果不是,则返回false,但如果是,则检查myArr中当前数组中的每个元素是否也包含在newArr中。 - Nenad Vracar
我建议小心使用 .includes 方法,因为 Internet Explorer 不支持它。 - David Anthony Acosta

2
你可以使用排序后连接的元素创建临时数组,并通过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, 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; }


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接