Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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_Object - Fatal编程技术网

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