Jak połączyć właściwości z wielu obiektów JavaScript
Szukam najlepszego sposobu na "dodanie" wielu obiektów JavaScript (tablic asocjacyjnych).
Na przykład:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
Jaki jest najlepszy sposób obliczania:
{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
11 answers
ECMAscript 6 wprowadził Object.assign()
, aby osiągnąć to natywnie w Javascript.
Obiekt .metoda assign () służy do kopiowania wartości wszystkich możliwych do wyliczenia własnych właściwości z jednego lub więcej obiektów źródłowych do obiektu docelowego. Zwróci obiekt docelowy.
Dokumentacja MDN na obiekcie.Przypisz()
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
jest obsługiwany w wielu nowoczesnych przeglądarkach, ale nie wszystkie z nich. Użyj transpilera typu Babel i Traceur do generowania wstecznie kompatybilnego JavaScript ES5.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-24 16:44:12
JQuery ma dobry sposób na to.
To powinno wystarczyć:
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;
}
Wejście:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
d = collect(a, b, c);
console.log(d);
Wyjście:
Object one=1 two=2 three=3 four=4 five=5
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 13:42:41
Podkreślenie ma kilka metod, aby to zrobić;
1. _.extend (destination, * sources)
Skopiuj wszystkie właściwości obiektów source do obiektu destination i Zwróć obiekt destination.
_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Lub
_.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)
Wypełnij undefined właściwości w object wartościami z defaults obiektów i zwraca obiekt .
_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Lub
_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 09:24:18
ECMAScript 6 ma operator spreadu . A teraz możesz to zrobić:
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}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 08:16:44
Dlaczego funkcja powinna być ograniczona do 3 argumentów? Sprawdź również hasOwnProperty
.
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 13:55:29
function Collect(a, b, c) {
for (property in b)
a[property] = b[property];
for (property in c)
a[property] = c[property];
return a;
}
Uwaga: istniejące właściwości w poprzednich obiektach zostaną nadpisane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 12:38:37
Prawdopodobnie najszybszy, wydajniejszy i bardziej ogólny sposób jest taki (można scalić dowolną liczbę obiektów, a nawet skopiować do pierwszego - > przypisać):
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];
}
Pozwala również na modyfikację pierwszego obiektu, który przeszedł przez odniesienie. Jeśli nie chcesz tego, ale chcesz mieć zupełnie nowy obiekt zawierający wszystkie właściwości, możesz przekazać {} jako pierwszy argument.
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 i object1 zawierają właściwości obiekt1, obiekt2,obiekt3.
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);
W tym przypadku combined_object zawiera właściwości object1, object2,object3, ale obiekt1 nie jest modyfikowany.
Sprawdź tutaj: https://jsfiddle.net/ppwovxey/1/
Uwaga: Obiekty JavaScript są przekazywane przez odniesienie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 01:39:23
Najprostszy: operatory spread
var obj1 = {a: 1}
var obj2 = {b: 2}
var concat = { ...obj1, ...obj2 } // { a: 1, b: 2 }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 05:03:40
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 12:49:08
ES6 ++
Pytanie polega na dodaniu różnychróżnych obiektów w jeden.
let obj = {};
const obj1 = { foo: 'bar' };
const obj2 = { bar: 'foo' };
Object.assign(obj, obj1, obj2);
//output => {foo: 'bar', bar: 'foo'};
Powiedzmy, że masz jeden obiekt z wieloma kluczami, które są obiektami:
let obj = {
foo: { bar: 'foo' },
bar: { foo: 'bar' }
}
Takie rozwiązanie znalazłem (jeszcze muszę foreach :/)
let objAll = {};
Object.values(obj).forEach(o => {
objAll = {...objAll, ...o};
});
W ten sposób możemy dynamicznie dodać wszystkie klucze obiektu do jednego.
// Output => { bar: 'foo', foo: 'bar' }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-21 03:40:11