javascript-将属性添加到对象文本并返回
我有对象文字,我把它当作基本对象:javascript-将属性添加到对象文本并返回,javascript,object,Javascript,Object,我有对象文字,我把它当作基本对象: var obj = { key1 : 'value1', key2 : 'value2' } 并希望使用此对象并将其传递给具有类似扩展的函数 myFunction( obj + { key3 : 'value3' } ); // param became: { key1 : 'value1', key2 : 'value2', key3 : 'value3' } 或 +运算符对其不正确。我怎么能做到?这是
var obj = {
key1 : 'value1',
key2 : 'value2'
}
并希望使用此对象并将其传递给具有类似扩展的函数
myFunction( obj + { key3 : 'value3' } );
// param became:
{
key1 : 'value1',
key2 : 'value2',
key3 : 'value3'
}
或
+
运算符对其不正确。我怎么能做到?这是一种方式吗
编辑:是否要永久更改
obj
?-不,我希望能够将其重新用作下一次呼叫的基础。如果您可以更改obj
,只需在通过它之前更改它即可:
var obj = { /* stuff */ };
obj.key3 = 'value3';
myFunction(obj);
是否要永久更改obj?-不,我希望能够将其作为基础重新用于下一次呼叫 好的,所以您需要在调用
myFunction
之前,更改副本:
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction($.extend({}, obj, extension));
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction(obj, extension);
或者将obj
和“扩展名”传递到myFunction
:
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction($.extend({}, obj, extension));
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction(obj, extension);
并让myFunction
完成以下工作:
function myFunction(base, ext)
{
if (typeof base === 'object' && typeof ext === 'object')
{
base = $.extend({}, base, ext);
}
// rest of the function logic here
}
如果您已经(或不介意)在使用jQuery,您将是执行此任务的最佳朋友。您可以创建一个无破坏性扩展对象的函数(不是“扩展”,实际上,只需从另一个对象创建一个新对象),例如:
var oldObj = {name: 'foo'};
function extendNonDestructive(src, newProps) {
function F() {} F.prototype = src;
var newObj = new F;
for (var p in newProps) {
if (newProps.hasOwnProperty(p)) {
newObj[p] = newProps[p]
}
}
return newObj
}
var newObj = extendNonDestructive(oldObj, {lastName: 'bar'}); // Doesn't touch oldObj
注意:您可能对哪种方式比我的代码中的“function F(){};F.prototype=src;”更灵活感兴趣,但它是ES5+。如果您想向现有对象添加属性并在一行中返回新对象,您可以使用和object.entries函数的组合:
console.log(
Object.fromEntries(
Object.entries({
t:4,
f:2
})
康卡特先生(
Object.entries({
问:2,,
p:9
})
)
)
);
使用ES2018或TypeScript 2.1,您可以使用
使用ES2015,您可以使用
var obj={key1:'value1',key2:'value2'}
log('--对象排列--');
log({…obj,key3:'value3'});
console.log('overwrite');
log({…obj,key2:'NEW2'});
console.log('no overwrite');
log({key2:'NEW2',…obj});
log('--objectassign--');
log(Object.assign({key3:'value3'},obj));
console.log('overwrite');
log(Object.assign({},obj,{key2:'NEW2'}));
console.log('no overwrite');
log(Object.assign({key2:'NEW2'},obj));
log('--Original Object unchanged--');
控制台日志(obj)代码>是否要永久更改obj?-不,我希望能够在下次调用时将其作为基础进行重用。这与$.extend
所做的差不多-只是没有jQuery;-)代码>且不更改原始文件。我不知道他是否使用了jquerytolly有效点,尽管$.extend()
不必更改原始参数,只需将{}
作为第一个参数传递即可。在意识到这是必要的之后,我编辑了我的答案。第二个ES2015示例可以缩短为myFunction(Object.assign({},obj,{key3:'value3}))代码>
// Object.assign(a, b, c, ..) - copy properties from b to a, then from c to a etc.
// Overwrite properties from obj
myFunction( Object.assign({}, obj, { key3: 'value3' }) );
// Don't overwrite properties from obj
myFunction( Object.assign({ key3: 'value3' }, obj) );