我正在寻找最佳方法来“添加”多个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 }
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}, ....])
。 - Jeanluca ScaljeriObject.assign( ...objects )
,而不是使用 Object.assign.apply
。 - SpenECMAScript 6拥有扩展语法。现在,您可以这样做:
const obj1 = { 1: 11, 2: 22 };
const obj2 = { 3: 33, 4: 44 };
const obj3 = { ...obj1, ...obj2 };
console.log(obj3); // {1: 11, 2: 22, 3: 33, 4: 44}
Object.assign
现在已经过时了,不如这个易读。 - rugkObject.assign({}, ...objcs)
或者 Object.assign.apply({}, objcs)
。 - Hexceptionfunction 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
}
for (var i=0; i<len; i++)
,因为这会暗示计数器循环变量 i
是一个局部变量,其作用域仅限于循环内部,这会让人感到困惑,因为 JS 没有这样的局部变量概念。相反,i
(以及当前未声明的 p
)应该在函数开头声明。 - Gerd Wagner你可以像这样使用jQuery的$.extend
:
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);
- Bob SteinUnderscore有一些方法可以实现这个功能;
1. _.extend(destination, *sources)
将源对象中的所有属性复制到目标对象中,并返回目标对象。
_.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 }
2. _.defaults(object, *defaults)
该函数用来将defaults对象中的属性值填充到object对象中未定义或为undefined的属性中,然后返回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 }
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 (...) operator在许多现代浏览器中得到支持,但并非所有浏览器都支持。
因此,建议使用转译器(如Babel)将 ECMAScript 2015+ 代码转换为当前和旧版浏览器或环境中向后兼容的 JavaScript 版本。
这是Babel将为您生成的等效代码:
"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 }
Object.assign
和 展开语法。const mergeObjs = (...objs) => Object.assign({}, ...objs);
const mergeObjs = (...objs) => Object.assign({}, ...objs);
const a = {prop: 1, prop2: '2'},
b = {prop3: 3, prop4: [1,2,3,4]}
c = {prop5: 5},
d = {prop6: true, prop7: -1},
e = {prop1: 2};
const abcd = mergeObjs(a,b,c,d);
console.log("Merged a,b,c,d:", abcd);
const abd = mergeObjs(a,b,d);
console.log("Merged a,b,d:", abd);
const ae = mergeObjs(a,e);//prop1 from e will overwrite prop1 from a
console.log("Merged a,e:", ae);
要合并对象数组,可以应用类似的方法。
const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
演示:
const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
const arr = [
{a: 1, b: 2},
{c:1, d:3},
{abcd: [1,2,3,4], d: 4}
];
const merged = mergeArrayOfObjs(arr);
console.log(merged);
function Collect() {
var o={};
for(var i=0;i<arguments.length;i++) {
var arg=arguments[i];
if(typeof arg != "object") continue;
for(var p in arg) {
if(arg.hasOwnProperty(p)) o[p] = arg[p];
}
}
return o;
}
({ name: "Alex", ...(true ? { age: 19 } : { })}) // {name: "Alex", age: 19}
({ name: "Alex", ...(false ? { age: 19 } : { })}) // {name: "Alex", }
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' }
}
let objAll = {};
Object.values(obj).forEach(o => {
objAll = {...objAll, ...o};
});
通过这样做,我们可以动态地将所有对象键添加到一个中。
// Output => { bar: 'foo', foo: 'bar' }