Как избежать b.push(a); добавления дубликатов, когда b было пустым (b = []) или имело значение, как показано ниже?

var a = ["username1", "1"];
var b = [ ["username1", "1"], ["username2", "2"] ];
b.push(a);
-1
user285594 10 Янв 2017 в 14:10

3 ответа

Лучший ответ

Сначала вы можете использовать some() и every(), чтобы проверить, существует ли a в b, а затем использовать push.

var a = ["username1", "1"];
var b = [ ["username1", "1"], ["username2", "2"] ];

var check = b.some(function(e) {
  return a.length == e.length && a.every(function(c) {
    return e.includes(c)
  })
})

if (!check) b.push(a);
console.log(b)
5
Nenad Vracar 10 Янв 2017 в 11:17

Преобразовать в строку JSON и сравнить массивы.

var a = ["username1", "1"];
var a1 = ["username3", "1"];
var b = [
  ["username1", "1"],
  ["username2", "2"]
];

Array.prototype.pushCustom = function(item) {
  if (this.every(function(v) {
    return JSON.stringify(v) != JSON.stringify(item);
  }))
    this.push(item);
};

b.pushCustom(a);
b.pushCustom(a1);

console.log(b);
0
Pranav C Balan 10 Янв 2017 в 11:30

Не существует автоматического способа предотвращения дубликатов, вы должны проверить их самостоятельно.

Проверьте фрагмент:

var a = ["username1", "1"];
var b = [ a, ["username2", "2"] ];

if(b.find(function(element) { return element == a })) {
   b.push(a);
}

Если запись в массиве b имеет другую идентичность, вам следует проверить значения внутри нее.

Вы можете сделать это следующим образом:

var a = ["username1", "1"];
var b = [ ["username1", "1"], ["username2", "2"] ];

if(b.find(function(element) { return element[0] == a[0] })) {
   b.push(a);
}
0
Mateusz Woźniak 10 Янв 2017 в 12:12