2017-04-14 5 views
0

Was wäre der beste Weg, um zusätzliche Eigenschaften von einem Objekt zu entfernen, das nicht im Standardobjekt definiert ist?Entfernen Sie zusätzliche Eigenschaften von Objekt

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) ; 

Wunsch Ausgang ....

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

} 
+0

Mögliches Duplikat von [Löschen Eigenschaft von Objekt in Javascript] (http://stackoverflow.com/questions/9983710/deleting-property-from-object-in-javascript) –

+0

so Verwenden Sie Reduzieren oder Löschen – epascarello

Antwort

2

Bevor Sie $ .extend aufrufen, legen Sie die folgenden.

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

Diese Schleife wird über jeden Schlüssel in newItem und prüfen, ob es in defaults auch ein Schlüssel ist. Beachten Sie, dass dies newItem ändert. Wenn das nicht gewünscht ist, müssen Sie etwas optimieren.

2

Sie Object.keys(defaults) zu einem Objekt reduzieren könnten entweder den Umgehungswert oder den Standardwert enthält:

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

Nur fusionieren Eigenschaften, die in defaults Objekt vorhanden: (einfach und unterstützt alten Browser)

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

Einige Code, den ich mit, dass gespielt haben von Interesse sein können, und ein Beispiel, wie Sie es mit Ihrer Frage verwenden können.

'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>

Verwandte Themen