我有以下数组,
["aa","bb"]
我有以下对象,
{"aa":1,"bb":2,"cc":3}
我需要下面的结果,
{"cc":3}
我需要将数组与对象键进行比较,使用循环是可能的,但是对于大量数据需要更多时间,有没有其他最快的方法来获得我的结果而不使用循环,Anyhelp Appreciated ...
答案 0 :(得分:2)
为避免二次时间复杂度,您可以使用Set并将其作为this
参数传递给过滤器。然后使用Object.assign
:
var a = ["aa","bb"];
var b = {"aa":1,"bb":2,"cc":3};
var difference = Object.assign(...Object.keys(b).filter(function(e){
return !this.has(e);
}, new Set(a)).map(key => ({ [key]: b[key] }) ));
console.log(difference);
答案 1 :(得分:1)
如果您可以改变对象,那么您可以使用delete
删除不需要的属性。
const props = ["aa","bb"];
const obj = {"aa": 1,"bb": 2,"cc": 3};
props.forEach(prop => delete obj[prop]);
console.log(obj);

或者只使用for...of
循环遍历属性名称数组。
const props = ["aa","bb"];
const obj = {"aa": 1,"bb": 2,"cc": 3};
for (prop of props) delete obj[prop];
console.log(obj);

如果您不想改变对象,而是创建一个没有不需要的属性的新对象,那么您可以先使用
进行浅层克隆newObj = {...obj};
答案 2 :(得分:0)
这样的事可能吗?
var a = ["aa","bb"];
var b = {"aa":1,"bb":2,"cc":3};
var result = {};
Object.keys(b).filter(function(e){
return a.indexOf(e) < 0;
}).forEach(function(e){
result[e] = b[e];
});
console.log(result);
答案 3 :(得分:0)
循环遍历该对象并检查该属性是否不存在于数组中:
var a = ["aa","bb"];
var o = {"aa":1,"bb":2,"cc":3};
// Loop through object
for(var prop in o){
// If property doesn't exist in array...
if(a.indexOf(prop) === -1){
console.log(prop + ":" + o[prop]);
}
}
&#13;
答案 4 :(得分:0)
您可以遍历该对象并将对象键与数组项进行比较,并将缺少的键作为对象返回。
var a = ["aa","bb"] ;
var o = {"aa":1,"bb":2,"cc":3,'dd':4};
function get(o){
var p = {};
for(var key in o){
if(a.indexOf(key) == -1){
p[key] = o[key];
}
}
return p;
}
var c = get(o);
console.log(c);
答案 5 :(得分:0)
您可以使用Object.assign()
,Object.entries()
,Array.prototype.includes()
来确定对象中的当前键是否是数组元素,使用computed属性返回对象还是false,这不会导致属性被分配到新对象
var arr = ["aa","bb"]
var obj = {"aa":1,"bb":2,"cc":3}
var res = Object.assign({}
, ...Object.entries(obj).map(([key, prop]) =>
!arr.includes(key) && {[key]:prop})
);
console.log(res);