Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从对象中删除额外属性_Javascript_Jquery_Object - Fatal编程技术网

Javascript 从对象中删除额外属性

Javascript 从对象中删除额外属性,javascript,jquery,object,Javascript,Jquery,Object,从默认对象中未定义的对象中删除任何附加属性的最佳方法是什么 var defaults = { color : 'blue', size: 9, price : 40.00, instock : true }, newItem = { color: 'red', size : 4, price : 20.00 extra : invalid // discard this extra1 : invalid // d

从默认对象中未定义的对象中删除任何附加属性的最佳方法是什么

var 

defaults = {

    color : 'blue',
    size: 9,
    price : 40.00,
    instock : true

},

newItem = {

    color: 'red',
    size : 4,
    price : 20.00
    extra : invalid // discard this
    extra1 : invalid // discard this

},

item = $.extend( defaults, newObject ) ;
所需输出…

{
    color : 'red',
    size: 4,
    price : 20.00,
    instock : true

}

在调用$.extend之前,请输入以下内容

for(variable in newItem) {
    if(!(variable in defaults)) {
        delete newItem[variable];
    }
}

这将在
newItem
中的每个键上循环,并检查它是否也是
默认值中的键。请注意,这将修改
newItem
,因此如果不需要这样做,则需要进行一些调整。

您可以将
Object.keys(默认值)
减少为包含覆盖值或默认值的对象:

var默认值={
颜色:“蓝色”,
尺码:9,
价格:40.00,
英斯托克:是的
},
新项目={
颜色:“红色”,
尺寸:4,
价格:20.00,
额外:“无效”,
附加条款1:“无效”
};
函数getOverrides(默认值,obj){
返回Object.keys(默认值).reduce(函数(结果,cur){
结果[cur]=对象中的cur?对象[cur]:默认值[cur];
返回结果;
}, {});
}

log(getOverrides(默认值,newItem))仅合并存在于
默认值
对象中的属性:(简单且支持旧浏览器)

var默认值={
颜色:“蓝色”,
尺码:9,
价格:40.00,
英斯托克:是的
};
var newItem={
颜色:“红色”,
尺寸:4,
价格:20.00,
额外:'无效',//放弃此
extra1:'无效'//放弃此
};
var result={};
对于(默认情况下的var i){
结果[i]=newItem.hasOwnProperty(i)?newItem[i]:默认值[i];
}

控制台日志(结果)根据此性能比较:

最有效的方法是:

for(attr in newItem) {
  if(defaults[attr] === undefined)
    delete newItem[attr];
}

我一直在玩的一些代码可能很有趣,并且是一个如何在您的问题中使用它的示例

“严格使用”;
var slice=Function.call.bind(Array.prototype.slice);
var reflectAssign=功能分配(目标){
返回片(参数,1).every(函数(源){
if(source==null){
返回true;
}
var对象=对象(源);
返回Reflect.ownKeys(对象).every(函数(键){
返回Reflect.set(目标、键、对象[key]);
});
});
};
var reflectAssignHas=功能(目标){
var targetKeys=Reflect.ownKeys(目标);
返回片(参数,1).every(函数(源){
if(source==null){
返回true;
}
var对象=对象(源);
返回targetKeys.every(函数(键){
返回Reflect.has(object,key)?Reflect.set(target,key,object[key]):true
});
});
};
var默认值={
颜色:“蓝色”,
尺码:9,
价格:40.00,
英斯托克:是的
};
var newItem={
颜色:“红色”,
尺寸:4,
价格:20.00,
额外:'无效',//放弃此
extra1:'无效'//放弃此
};
var item={};
log(reflectsign(项,默认值));
log(reflectAssignHas(item,newItem));
控制台日志(项目)

so的可能重复使用减少或删除