2017-04-14 85 views
0

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

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 

} 
+0

[从以JavaScript对象删除属性]的可能的复制(http://stackoverflow.com/questions/9983710/deleting-property-from-object-in-javascript) –

+0

所以使用减少或删除 – epascarello

回答

2

在打电话之前,$ .extend,把下面。

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

这将循环遍历newItem每一个关键,并检查它也是defaults的关键。请注意,这将修改newItem,所以如果不需要,您需要做一些调整。

2

你可以减少Object.keys(defaults)包含任何覆盖值或默认值的对象:

var defaults = { 
 

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

 
}, 
 
newItem = { 
 

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

 
}; 
 

 
function getOverrides(defaults, obj) { 
 
    return Object.keys(defaults).reduce(function(result, cur) { 
 
     result[cur] = cur in obj ? obj[cur] : defaults[cur]; 
 
     return result; 
 
    }, {}); 
 
} 
 

 
console.log(getOverrides(defaults, newItem));

1

仅合并其现有的在defaults对象属性:(简单,并且支持旧的浏览器)

var defaults = { 
 
    color : 'blue', 
 
    size: 9, 
 
    price : 40.00, 
 
    instock : true 
 

 
}; 
 

 
var newItem = { 
 
    color: 'red', 
 
    size : 4, 
 
    price : 20.00, 
 
    extra : 'invalid', // discard this 
 
    extra1 : 'invalid' // discard this 
 

 
}; 
 

 
var result = {}; 
 
for (var i in defaults) { 
 
    result[i] = newItem.hasOwnProperty(i) ? newItem[i] : defaults[i]; 
 
} 
 

 
console.log(result);

0

一些代码,我一直在玩,可能是趣味性,一个如何与你的问题一起使用的例子。

'use strict'; 
 

 
var slice = Function.call.bind(Array.prototype.slice); 
 

 
var reflectAssign = function assign(target) { 
 
    return slice(arguments, 1).every(function(source) { 
 
    if (source == null) { 
 
     return true; 
 
    } 
 
    var object = Object(source); 
 
    return Reflect.ownKeys(object).every(function(key) { 
 
     return Reflect.set(target, key, object[key]); 
 
    }); 
 
    }); 
 
}; 
 

 
var reflectAssignHas = function(target) { 
 
    var targetKeys = Reflect.ownKeys(target); 
 
    return slice(arguments, 1).every(function(source) { 
 
    if (source == null) { 
 
     return true; 
 
    } 
 
    var object = Object(source); 
 
    return targetKeys.every(function(key) { 
 
     return Reflect.has(object, key) ? Reflect.set(target, key, object[key]) : true 
 
    }); 
 
    }); 
 
}; 
 

 
var defaults = { 
 
    color: 'blue', 
 
    size: 9, 
 
    price: 40.00, 
 
    instock: true 
 
}; 
 

 
var newItem = { 
 
    color: 'red', 
 
    size: 4, 
 
    price: 20.00, 
 
    extra: 'invalid', // discard this 
 
    extra1: 'invalid' // discard this 
 
}; 
 

 
var item = {}; 
 
console.log(reflectAssign(item, defaults)); 
 
console.log(reflectAssignHas(item, newItem)); 
 
console.log(item);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-sham.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.35.3/es6-shim.js"></script>