从数组中删除已删除的值

时间:2018-11-14 13:22:50

标签: javascript arrays angular typescript filter

我有两个数组,例如,

数组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我已经尝试过

值也不会总是唯一的,它可能与任何对象都完全相同。

如何比较和删除普通数组中已删除的值并获取newarray?

5 个答案:

答案 0 :(得分:1)

您的filter谓词不起作用,因为您不能仅将normalArray中的对象与deletedValuesfromArray中的对象进行比较:

  

indexOf()searchElementArray的元素进行比较,使用   严格相等(===或三重相等使用的相同方法   运算符)。

-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工作,您需要实现比较功能。有关一些想法,请参见How to determine equality for two JavaScript objects?

答案 1 :(得分:0)

您可以继续使用 ES6运算符过滤器 some ):

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

答案 2 :(得分:0)

这里一个简单的选项可以使用-specs=nano.specs -specs=nosys.specs ,它将对象转换成字符串并将它们作为字符串进行比较,因为2个对象从不相互取值,因为它通过引用对它们进行比较,请确保您的对象按键顺序相同

JSON.stringify

答案 3 :(得分:0)

使用lodash:-

npm install --save lodash


import * as _ from "lodash";

var newArray = _.differenceWith(this.normalArray, this.deletedValuesfromArray, _.isEqual);
console.log("newArray", newArray);

答案 4 :(得分:0)

这也可能对您有帮助。

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

});    }