Я пытаюсь удалить объект массива, если его идентификатор совпадает с идентификатором объекта в другом массиве. Но я не знаю, как это сделать.

Примере:

parentArray1 = [ 
  { 
     id: 101
     ... 
  }, { 
     REMOVE THIS OBJECT BECAUSE ITS ID IS THE SAME AS parentArray2[0].id
     id: 102 
     ...
  }, { 
     id: 103 
     ...
  } 
];

parentArray2 = [ 
  { 
     id: 102 // SAME ID AS parentArray1[1].id
     ... 
  }  
];

У кого-нибудь есть идея или решение?

2
J. Sadi 6 Янв 2017 в 15:55

4 ответа

Лучший ответ

Фильтр, чтобы сохранить элемент, если он не соответствует элементу некоторому во втором:

parentArray1.filter(elt1 => !parentArray2.some(elt2 => elt2.id === elt1.id))

Вот это в построчно закомментированном формате:

parentArray1                       // From parentArray1
  .filter(                         // keep all the
    elt1 =>                        // elements for which 
      !                            // it is not the case that
      parentArray2                 // parentArray2
        .some(                     // has some
          elt2 =>                  // elements for which
            elt2.id                // the id
            ===                    // is equal to
            elt1.id))              // the id of the first element.

Немного деструктуризации ES6 для вас:

parentArray1.filter(({id1}) => !parentArray2.some(({id2}) => id1 === id2))

В ES5 без функций стрелок:

parentArray.filter(function(elt1) {
  return !parentArray2.some(function(elt2) {
    return elt2.id === elt1.id;
  });
})

Если вы хотите сделать это с помощью for-loop:

result = [];

for (var i = 0; i < parentArray1.length; i++) {
  var include = true;
  for (var j = 0; j < parentArray2.length; j++) {
    if (parentArray1[i].id === parentArray2[j].id) include = false;
  }
  if (include) result.push(parentArray1[i]);
}

Вы также можете рассмотреть возможность предварительного расчета списка идентификаторов, которые будут удалены:

var removeIds = parentArray2.map(elt => elt.id);

Теперь вы можете фильтровать parentArray1 проще:

parentArray1.filter(elt => !removeIds.contains(elt.id))
4
6 Янв 2017 в 14:04

Вы можете использовать filter() и find(), чтобы получить желаемый результат.

var parentArray1 = [{
  id: 101
}, {
  id: 102
}, {
  id: 103
}];

var parentArray2 = [{
  id: 102
}, {
  id: 199
}];

var result = parentArray1.filter(function(o) {
  return !parentArray2.find(function(e) {
    return o.id == e.id
  })
})

console.log(result)
1
Nenad Vracar 6 Янв 2017 в 13:37

Вы можете использовать findIndex, и если вы получите правильный индекс, склейте его.

parentArray1 = [{
  id: 101
}, {
  //REMOVE THIS OBJECT BECAUSE ITS ID IS THE SAME AS parentArray2[0].id
  id: 102
}, {
  id: 103
}, {
  //REMOVE THIS OBJECT BECAUSE ITS ID IS THE SAME AS parentArray2[0].id
  id: 102
}];

parentArray2 = [{
  id: 102 // SAME ID AS parentArray1[1].id
}];

for(var i = 0; i< parentArray2.length; i++){
  var index = parentArray1.findIndex(x=>x.id === parentArray2[i].id);
  if(index !== -1){
    parentArray1.splice(index,1);
    i--;
  }
}

console.log(parentArray1)
1
Rajesh 6 Янв 2017 в 13:46

Хорошо, я подготовил несколько примеров кода (скопировать в 3-й массив, удалить из массива, function и prototype). Попробуйте с:

Скопировать в новый массив .

var a = [
    {id:1,name:"Paul"},
    {id:2,name:"Andre"},
    {id:3,name:"Sophie"},
    {id:4,name:"Anton"},
    {id:5,name:"John"},
    {id:6,name:"Einar"}
];
var b = [
    {id:2,name:"Andre"},
    {id:5,name:"John"}
];

var c = [];

a.forEach(function(aItem, aIndex) {
    var copy = true;    
    b.forEach(function(bItem, bIndex) {
        if (aItem.id === bItem.id) {
            copy = false;
        }
    });
    
    if(copy === true) {
        c.push(aItem);
    }
    
});


console.log(c);

Удалить из первого массива:

var a = [
    {id:1,name:"Paul"},
    {id:2,name:"Andre"},
    {id:3,name:"Sophie"},
    {id:4,name:"Anton"},
    {id:5,name:"John"},
    {id:6,name:"Einar"}
];
var b = [
    {id:2,name:"Andre"},
    {id:5,name:"John"}
];

a.forEach(function(aItem, aIndex) {
    b.forEach(function(bItem, bIndex) {
        if (aItem.id === bItem.id) {
            a.splice(aIndex, 1);
        }
    });
});


console.log(a);

Как функция .

var a = [
    {id:1,name:"Paul"},
    {id:2,name:"Andre"},
    {id:3,name:"Sophie"},
    {id:4,name:"Anton"},
    {id:5,name:"John"},
    {id:6,name:"Einar"}
];
var b = [
    {id:2,name:"Andre"},
    {id:5,name:"John"}
];

function removeItemFromArrayByIndexObject(from, to, index) {
    var result = [];
    for (var i = 0; i < from.length; i++) {
        var append = true;
        for (var j = 0; j < to.length; j++) if (from[i][index] === to[j][index]) append = false;
        if (append === true) result.push(from[i]);
    }
    return result;
}


console.log(removeItemFromArrayByIndexObject(a, b, 'id'))

Как прототип:

// first array
var a = [
    {id:1,name:"Paul"},
    {id:2,name:"Andre"},
    {id:3,name:"Sophie"},
    {id:4,name:"Anton"},
    {id:5,name:"John"},
    {id:6,name:"Einar"}
];
// second array
var b = [
    {id:2,name:"Andre"},
    {id:5,name:"John"}
];
// create prototype
Array.prototype.removeItemFromArrayByIndexObject = function (to, index) {
    var result = [];
    for (var i = 0; i < this.length; i++) {
        var remove = false;
        for (var j = 0; j < to.length; j++) if (this[i][index] === to[j][index]) remove = true;
        if (remove === true) this.splice(i, 1);
    }
    return this;
}
// apply
a.removeItemFromArrayByIndexObject(b, 'id')
// log
console.log(a);
1
Jorge Olaf Erlandsen 6 Янв 2017 в 14:47