Удалить удаленные значения из массива - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть два массива, такие как,

Массив 1 :

    deletedValuesfromArray =
     [
        { "property_name": "Property three", "property_type": 4, "property_required": true, "property_origin": 2 }, 
        { "property_name": "rstywrtre", "property_type": 3, "property_required": true, "property_origin": 1 }
     ]

Массив 2:

  normalArray =
   [
    { "property_name": "Property one", "property_type": 4, "property_required": true, "property_origin": 1 },
     { "property_name": "Property two", "property_type": 5, "property_required": true, "property_origin": 1 }, 
     { "property_name": "Property three", "property_type": 4, "property_required": true, "property_origin": 2 }, 
     { "property_name": "rstywrtre", "property_type": 3, "property_required": true, "property_origin": 1 }
   ]

Я бы хотел сравнить оба массива и отфильтровать массив, чтобы получить новый после удаления deletedValuesfromArray (Массив 1).

Для чего я пробовал следующее,

let newArray = this.normalArray.filter(function (val) {
  return this.deletedValuesfromArray.indexOf(val) == -1;
});
console.log(newArray);

Но это не работает ..

Ожидаемый результат:

Новый массив

   [
     { "property_name": "Property one", "property_type": 4, "property_required": true, "property_origin": 1 },
     { "property_name": "Property two", "property_type": 5, "property_required": true, "property_origin": 1 }
   ]

Stackblitz , которые я пробовал

Значения также не будут уникальными, всегда могут иметь полную копию любого объекта.

Как сравнить и удалить удаленные значения из обычного массива и получить новый массив?

Ответы [ 5 ]

0 голосов
/ 15 ноября 2018

Это также может помочь вам.

function display()
{
  let newArray = this.normalArray.filter(function (val) {
  count = 0;
  var flag = true;
  return this.deletedValuesfromArray.find(function(item, i){
  count++;

     if(val.property_name == item.property_name && val.property_type == item.property_type && val.property_required == item.property_required && val.property_origin == item.property_origin ){
       flag =  false;
     }
     if(count == deletedValuesfromArray.length) {
     return flag;
     }
  });

});}

0 голосов
/ 14 ноября 2018

Использование lodash: -

npm install --save lodash


import * as _ from "lodash";

var newArray = _.differenceWith(this.normalArray, this.deletedValuesfromArray, _.isEqual);
console.log("newArray", newArray);
0 голосов
/ 14 ноября 2018

Вы можете продолжить с операторами ES6 ( фильтр и некоторые ):

 ngOnInit() {
    let newArray = this.normalArray.filter( (val) => {
      return !this.deletedValuesfromArray.some((newval) => {
       return JSON.stringify(newval) === JSON.stringify(val) // check if two objects are the same
      });
    });
    console.log(newArray);
  }
0 голосов
/ 14 ноября 2018

один из простых вариантов, здесь вы можете использовать JSON.stringify, который превратит объекты в строки и сравнит их как строки, потому что 2 объекта никогда не равняются друг другу по значению, так как он сравнивает их по ссылке, убедитесь, что ключи ваших объектов упорядоченыодинаковы

const deletedValuesfromArray =
     [
        { "property_name": "Property three", "property_type": 4, "property_required": true, "property_origin": 2 }, 
        { "property_name": "rstywrtre", "property_type": 3, "property_required": true, "property_origin": 1 }
     ]

  const normalArray =
   [
    { "property_name": "Property one", "property_type": 4, "property_required": true, "property_origin": 1 },
     { "property_name": "Property two", "property_type": 5, "property_required": true, "property_origin": 1 }, 
     { "property_name": "Property three", "property_type": 4, "property_required": true, "property_origin": 2 }, 
     { "property_name": "rstywrtre", "property_type": 3, "property_required": true, "property_origin": 1 }
   ]

const result = normalArray.filter(obj => !deletedValuesfromArray.find(o => JSON.stringify(o) == JSON.stringify(obj)));

console.log(result);
0 голосов
/ 14 ноября 2018

Ваш предикат filter не работает, потому что вы не можете просто сравнить объект из normalArray с объектом из deletedValuesfromArray:

indexOf(), сравнивает searchElement сэлементы Array, использующие строгое равенство (тот же метод, который используется оператором === или оператором тройного равенства).

- Array.indexOf ()

Другими словами,

{ "property_name": "Property one", "property_type": 4, "property_required": true, "property_origin": 1 } === { "property_name": "Property one", "property_type": 4, "property_required": true, "property_origin": 1 }
// > false

Чтобы заставить filter работать, вам нужно реализовать функцию сравнения.См. Как определить равенство для двух объектов JavaScript? для некоторых идей.

...