我正在寻找“添加”多个JavaScript对象(关联数组)的最佳方法。
例如,给定:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
什么是最好的计算方式:
{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
我正在寻找“添加”多个JavaScript对象(关联数组)的最佳方法。
例如,给定:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
什么是最好的计算方式:
{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Answers:
引入ECMAscript 6是Object.assign()
为了用Javascript本身实现此目的。
所述Object.assign()方法被用于所有可枚举自己的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
Object.assign
在许多现代浏览器中都受支持,但并非所有浏览器都支持。使用Babel和Traceur等编译器来生成向后兼容的ES5 JavaScript。
Object.assign.apply({}, [{a: 1}, {b: 2}, ....])
Object.assign.apply
用于合并对象数组的一种替代方法是改为使用散布运算符:Object.assign( ...objects )
您可以$.extend
像这样使用jquery :
let a = { "one" : 1, "two" : 2 },
b = { "three" : 3 },
c = { "four" : 4, "five" : 5 };
let d = $.extend({}, a, b, c)
console.log(d)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
d = $.extend({},a,b,c);
应该这样做:
function collect() {
var ret = {};
var len = arguments.length;
for (var i = 0; i < len; i++) {
for (p in arguments[i]) {
if (arguments[i].hasOwnProperty(p)) {
ret[p] = arguments[i][p];
}
}
}
return ret;
}
let a = { "one" : 1, "two" : 2 };
let b = { "three" : 3 };
let c = { "four" : 4, "five" : 5 };
let d = collect(a, b, c);
console.log(d);
输出:
{
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5
}
length
在每次调用时查找数组的大小吗?我很习惯写作for (var i = 0, len = array.length; i < len; ++i)
,以至于我不记得为什么开始这么做。
下划线几乎没有方法可以做到这一点;
将源对象中的所有属性复制到目标对象,然后返回目标对象。
_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
要么
_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
使用默认对象中的值填写对象中未定义的属性,然后返回object。
_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
要么
_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
现在可以使用比Object.assign()短的语法进行对象的浅克隆(不包括原型)或合并。
扩展语法为对象文本在引入的ECMAScript 2018):
const a = { "one": 1, "two": 2 };
const b = { "three": 3 };
const c = { "four": 4, "five": 5 };
const result = {...a, ...b, ...c};
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
许多现代浏览器都支持Spread(...)运算符,但并非所有浏览器都支持。
因此,建议在当前和较旧的浏览器或环境中使用类似Babel的编译器将ECMAScript 2015+代码转换为JavaScript的向后兼容版本。
"use strict";
var _extends = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var a = { "one": 1, "two": 2 };
var b = { "three": 3 };
var c = { "four": 4, "five": 5 };
var result = _extends({}, a, b, c);
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
function Collect(a, b, c) {
for (property in b)
a[property] = b[property];
for (property in c)
a[property] = c[property];
return a;
}
注意:先前对象中的现有属性将被覆盖。
a === d
。可能可以,但可能不能。
在浏览器控制台中将ES7传播运算符用于对象很容易
({ name: "Alex", ...(true ? { age: 19 } : { })}) // {name: "Alex", age: 19}
({ name: "Alex", ...(false ? { age: 19 } : { })}) // {name: "Alex", }
可能是最快,有效和更通用的方式(您可以合并任意数量的对象,甚至复制到第一个对象-> assign):
function object_merge(){
for (var i=1; i<arguments.length; i++)
for (var a in arguments[i])
arguments[0][a] = arguments[i][a];
return arguments[0];
}
它还允许您修改第一个通过引用传递的对象。如果您不希望这样做,而是希望拥有一个包含所有属性的全新对象,则可以将{}作为第一个参数传递。
var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge(object1,object2,object3);
Combined_object和object1都包含object1,object2,object3的属性。
var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge({},object1,object2,object3);
在这种情况下,combined_object包含对象1,对象2,对象3的属性,但对象1未被修改。
在这里检查:https : //jsfiddle.net/ppwovxey/1/
注意:JavaScript对象是通过引用传递的。
ES6 ++
问题是将各种不同的对象添加到一个对象中。
let obj = {};
const obj1 = { foo: 'bar' };
const obj2 = { bar: 'foo' };
Object.assign(obj, obj1, obj2);
//output => {foo: 'bar', bar: 'foo'};
假设您有一个带有多个键的对象,这些键是对象:
let obj = {
foo: { bar: 'foo' },
bar: { foo: 'bar' }
}
这是我找到的解决方案(仍然必须要进行foreach:/)
let objAll = {};
Object.values(obj).forEach(o => {
objAll = {...objAll, ...o};
});
通过这样做,我们可以将所有对象键动态地添加到一个中。
// Output => { bar: 'foo', foo: 'bar' }
function collect(a, b, c){
var d = {};
for(p in a){
d[p] = a[p];
}
for(p in b){
d[p] = b[p];
}
for(p in c){
d[p] = c[p];
}
return d;
}