我有两个数组,例如,
数组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?
答案 0 :(得分:1)
您的filter
谓词不起作用,因为您不能仅将normalArray
中的对象与deletedValuesfromArray
中的对象进行比较:
indexOf()
将searchElement
与Array
的元素进行比较,使用 严格相等(===或三重相等使用的相同方法 运算符)。
换句话说
{ "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;
}
});
}); }