複数の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 }
回答:
Object.assign()
これをJavascriptでネイティブに実現するために導入されたECMAscript 6 。
Object.assign()メソッドは、ターゲット・オブジェクトに1つ以上のソースオブジェクトからすべての列挙独自のプロパティの値をコピーするために使用されます。ターゲットオブジェクトを返します。
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)
、なぜ始めたのか頭の上から思い出すことができません。
アンダースコアには、これを行うためのいくつかの方法があります。
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 }
記入未定義のプロパティオブジェクトの値とデフォルトのオブジェクト、および戻りオブジェクト。
_.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()より短い構文を使用して、シャロークローニング(プロトタイプを除く)またはオブジェクトのマージが可能になりました。
スプレッド構文のためのオブジェクトリテラルは中に導入された 2018年のECMAScript):
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 }
スプレッド(...)演算子は、最新の多くのブラウザーでサポートされていますが、すべてではありません。
したがって、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 }
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", }
動的な数のオブジェクトをマージするにはObject.assign
、spread syntaxを使用できます。
const mergeObjs = (...objs) => Object.assign({}, ...objs);
上記の関数は任意の数のオブジェクトを受け入れ、すべてのプロパティを新しいオブジェクトにマージし、新しいオブジェクトのプロパティを以前のオブジェクトのプロパティに上書きします。
デモ:
オブジェクトの配列をマージするには、同様の方法を適用できます。
const mergeArrayOfObjs = arr => Object.assign({}, ...arr);
デモ:
おそらく、最も速く、効率的で、より一般的な方法はこれです(任意の数のオブジェクトをマージし、最初のオブジェクトにコピーすることもできます-> 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);
bound_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には、object1、object2、object3のプロパティが含まれていますが、object1は変更されていません。
ここをチェックしてください:https://jsfiddle.net/ppwovxey/1/
注:JavaScriptオブジェクトは参照渡しされます。
ES6 ++
問題は、さまざまな異なるオブジェクトを1つに追加することです。
let obj = {};
const obj1 = { foo: 'bar' };
const obj2 = { bar: 'foo' };
Object.assign(obj, obj1, obj2);
//output => {foo: 'bar', bar: 'foo'};
オブジェクトである複数のキーを持つ1つのオブジェクトがあるとします。
let obj = {
foo: { bar: 'foo' },
bar: { foo: 'bar' }
}
これは私が見つけた解決策でした(まだforeachする必要があります:/)
let objAll = {};
Object.values(obj).forEach(o => {
objAll = {...objAll, ...o};
});
これにより、すべてのオブジェクトキーを動的に1つに追加できます。
// Output => { bar: 'foo', foo: 'bar' }
最も単純:スプレッドオペレーター
var obj1 = {a: 1}
var obj2 = {b: 2}
var concat = { ...obj1, ...obj2 } // { a: 1, b: 2 }
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;
}