从对象中删除额外的属性

时间:2017-04-14 20:18:23

标签: 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 // discard this

},

item = $.extend( defaults, newObject ) ;

期望的输出......

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

}

5 个答案:

答案 0 :(得分:2)

在拨打$ .extend之前,请填写以下内容。

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

这将遍历newItem中的每个密钥,并检查它是defaults中的密钥。请注意,这会修改newItem,因此如果不需要,则需要进行一些调整。

答案 1 :(得分: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));

答案 2 :(得分:2)

根据这种表现比较: https://jsperf.com/dictionary-contains-key

最有效的方法是:

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

答案 3 :(得分: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);




答案 4 :(得分: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>