我有以下对象数组。
[{"rId":24,"gId":40,"sId":20,"disabled":false},
{"rId":24,"gId":40,"sId":19,"disabled":false},
{"rId":24,"gId":40,"sId":50,"disabled":false},
{"rId":24,"gId":40,"sId":20,"disabled":true},
{"rId":24,"gId":40,"sId":19,"disabled":true},
{"rId":24,"gId":40,"sId":50,"disabled":true},
{"rId":24,"gId":39,"sId":18,"disabled":false}]
其中一些记录是对立的。第一个元素和第四个元素具有相同的 rId、gId 和 sId 但禁用标志相反。 我想消除所有此类记录。
我期望的数组是 {"rId":24,"gId":39,"sId":18,"disabled":false}
(消除所有对偶记录)
我尝试了以下代码,但它给了我错误的输出。
arrOfObj=[{"rId":24,"gId":40,"sId":20,"disabled":false},
{"rId":24,"gId":40,"sId":19,"disabled":false},
{"rId":24,"gId":40,"sId":50,"disabled":false},
{"rId":24,"gId":40,"sId":20,"disabled":true},
{"rId":24,"gId":40,"sId":19,"disabled":true},
{"rId":24,"gId":40,"sId":50,"disabled":true},
{"rId":24,"gId":39,"sId":18,"disabled":false}]
$.each(arrOfObj,function (index1,firstObj) {
$.each(arrOfObj,function (index2,secondObj) {
if(index1>= index2){
return true;
}
var areObjAntithesis=firstObj.rId===secondObj.rId && firstObj.gId===secondObj.gId
&& firstObj.sId===secondObj.sId && firstObj.disabled!==secondObj.disabled;
if(areObjAntithesis){
arrOfObj.splice(index1,1);
arrOfObj.splice(index2,1)
return false;
}
})
})
有什么优雅的方法可以达到预期的输出吗?
最佳答案
您可以使用 map()
和 filter()
var data = [{"rId":24,"gId":40,"sId":20,"disabled":false},
{"rId":24,"gId":40,"sId":19,"disabled":false},
{"rId":24,"gId":40,"sId":50,"disabled":false},
{"rId":24,"gId":40,"sId":20,"disabled":true},
{"rId":24,"gId":40,"sId":19,"disabled":true},
{"rId":24,"gId":40,"sId":50,"disabled":true},
{"rId":24,"gId":39,"sId":18,"disabled":false}]
var ar = data.map(function(e) {
return e.rId + '|' + e.gId + '|' + e.sId;
});
var result = data.filter(function(e) {
var key = e.rId + '|' + e.gId + '|' + e.sId;
return ar.indexOf(key) == ar.lastIndexOf(key);
});
console.log(result)
关于javascript - 从对象数组javascript中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40485216/