我有以下JavaScript对象(new_object和old_object):
new_object:
0300 : ["297"],
0800 : ["297"],
0930 : ["293"],
old_object:
0300 : ["295", "293", "298", "297"],
0800 : ["293", "298", "297"],
0930 : ["295", "298", "293"],
1130 : ["297", "293", "298"],
1230 : ["295", "298"]
我想合并它们,以便最终对象就像
new_object['0300'].push
我为每个循环尝试了li
,但它无法正常工作
我怎样才能合并JavaScript对象?有没有最好的做法?
答案 0 :(得分:1)
试试这个:
for (var key in new_object){
if(old_object.hasOwnProperty(key)){
new_object[key] = new_object[key].concat(old_object[key]);
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为new_object['0300'].push
语法错误。
尝试new_object[0300].push
。
有用。但是输出很奇怪。
var newObject = {0300 : ["295", "293", "298"],0800 : ["293", "298"],0930 : ["295"],1130 : ["297", "293", "298"],1230 : ["295"]}
var oldObject = {0300 : ["297"],0800 : ["297"],0930 : ["293"]}
newObject[0300].push(oldObject[0300])
//console outputs: ["295", "293", "298", ["297"]]
所以我使用concat方法。
var newObject = {0300 : ["295", "293", "298"],0800 : ["293", "298"],0930 : ["295"],1130 : ["297", "293", "298"],1230 : ["295"]}
var oldObject = {0300 : ["297"],0800 : ["297"],0930 : ["293"]}
newObject[0300].concat(oldObject[0300])
//console outputs: ["295", "293", "298", "297"]
最后,合并两个Json对象。 试试这个。
并查看此问题> How can I merge properties of two JavaScript objects dynamically?
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
答案 3 :(得分:0)
实际上做了一个正确的解决方案......
var final_object = {};
var new_object_properties = Object.getOwnPropertyNames(new_object);
var old_object_properties = Object.getOwnPropertyNames(old_object);
var new_object_properties_length = new_object_properties.length;
var old_object_properties_length = old_object_properties.length;
if(new_object_properties_length > old_object_properties_length)
while(--new_object_properties_length){
var property_name = new_object_properties[new_object_properties_length];
if(old_object[property_name])
final_object[property_name] = new_object[property_name].concat(old_object[property_name];
else
final_object[property_name] = new_object_properties[new_object_properties_length];
}
else
while(--old_object_properties_length){
var property_name = old_object_properties[old_object_properties_length];
if(new_object[property_name])
final_object[property_name] = old_object[property_name].concat(new_object[property_name];
else
final_object[property_name] = old_object_properties[old_object_properties_length];
}
答案 4 :(得分:0)
首先,编写一个实用程序函数,根据作为函数传入的合并策略,将属性与两个对象中的相同键合并。
要将属性与两个对象中的相同键合并,我们遍历第二个键列表,并将值合并到第一个对象中(如果它具有相同键的属性),或者只是将其复制(如果它没有)。编写它的方式将改变(覆盖)o1
:
function merge_keys(o1, o2, merge) {
var keys2 = Object.keys(o2), key;
for (var i = 0; i < keys2.length; i++) {
key = keys2[i];
o1[key] = o1[key] ? merge(o1[key], o2[key]) : o2[key];
}
}
定义您要使用的合并策略:
function concat(a, b) { return a.concat(b); }
然后
merge_keys(new_object, old_object, concat);
请参阅http://jsfiddle.net/hootuoph/2/。
如果您使用ES6编程,可以使用for...of
:
function merge_keys(o1, o2, merge) {
for (var k of Object.keys(o2)) {
o1[k] = o1[k] ? merge(o1[k], o2[k]) : o2[k];
}
}
或者,如果您更喜欢使用Array#forEach
:
function merge_keys(o1, o2, merge) {
function maybe_merge(k) { o1[k] = o1[k] ? merge(o1[k], o2[k]) : o2[k]; }
Object.keys(o2).forEach(maybe_merge);
}