Vla*_*lad 93 javascript dictionary associative-array object
我正在寻找"添加"多个JavaScript对象(关联数组)的最佳方法.
例如,给定:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
Run Code Online (Sandbox Code Playgroud)
什么是最好的计算方法:
{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)
fil*_*oxo 133
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 }Run Code Online (Sandbox Code Playgroud)
Object.assign许多现代浏览器都支持它,但还不是全部.使用像Babel和Traceur这样的转换器生成向后兼容的ES5 JavaScript.
小智 34
jQuery有一个很好的方法来做到这一点.
http://api.jquery.com/jQuery.extend/
cle*_*tus 33
这应该这样做:
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);Run Code Online (Sandbox Code Playgroud)
输入:
{
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5
}
Run Code Online (Sandbox Code Playgroud)
输出:
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);Run Code Online (Sandbox Code Playgroud)
val*_*lex 21
ECMAScript 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}Run Code Online (Sandbox Code Playgroud)
gih*_*uka 12
Underscore几乎没有办法做到这一点;
将源对象中的所有属性复制到目标对象,然后返回目标对象.
_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)
要么
_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)
使用默认对象中的值填充对象中未定义的属性,并返回该对象.
_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)
要么
_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Run Code Online (Sandbox Code Playgroud)
Shallow-cloning (excluding prototype) or merging of objects is now possible using a shorter syntax than Object.assign().
Spread syntax for object literals was introduced in 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 }
Run Code Online (Sandbox Code Playgroud)
Spread (...) operator is supported in many modern browsers but not all of them.
So, it is recommend to use a transpiler like Babel to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments.
This is the equivalent code Babel will generate for you:
"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 }
Run Code Online (Sandbox Code Playgroud)
要合并动态数量的对象,我们可以使用Object.assign扩展语法。
const mergeObjs = (...objs) => Object.assign({}, ...objs);
Run Code Online (Sandbox Code Playgroud)
上面的函数接受任意数量的对象,将它们的所有属性合并到一个新对象中,其中后面对象的属性覆盖以前对象的属性。
演示:
const mergeObjs = (...objs) => Object.assign({}, ...objs);
Run Code Online (Sandbox Code Playgroud)
要合并对象数组,可以应用类似的方法。
const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
Run Code Online (Sandbox Code Playgroud)
演示:
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);Run Code Online (Sandbox Code Playgroud)