首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不使用JQUERY的情况下连接两个JavaScript对象

如何在不使用JQUERY的情况下连接两个JavaScript对象
EN

Stack Overflow用户
提问于 2014-01-30 15:16:03
回答 6查看 218.1K关注 0票数 106

我有两个 json 对象obj1和obj2,我想合并它们并创建一个json对象。生成的json应该具有来自obj2的所有值和来自obj1的值,而obj2中不存在这些值。

Question:

var obj1 = {
    "name":"manu",
    "age":23,
    "occupation":"SE"
}

var obj2 = {
    "name":"manu",
    "age":23,
    "country":"india"
}

Expected:

var result = {
    "name":"manu",
    "age":23,
    "occupation":"SE",
    "country":"india"
}
EN

回答 6

Stack Overflow用户

发布于 2014-01-30 15:19:25

有几种不同的解决方案可以实现这一点:

1 -原生javascript for-in循环

const result = {};
let key;

for (key in obj1) {
  if(obj1.hasOwnProperty(key)){
    result[key] = obj1[key];
  }
}

for (key in obj2) {
  if(obj2.hasOwnProperty(key)){
    result[key] = obj2[key];
  }
}

2 -

const result = {};

Object.keys(obj1)
  .forEach(key => result[key] = obj1[key]);

Object.keys(obj2)
  .forEach(key => result[key] = obj2[key]);

3 -

(浏览器兼容性: Chrome: 45,Firefox (Gecko):34,Internet Explorer:不支持,Edge:(是),Opera: 32,Safari: 9)

const result = Object.assign({}, obj1, obj2);

4 -

ECMAScript 2015 (6th Edition, ECMA-262)标准化

在规范的几个部分中定义的

Array InitializerArgument Lists

使用这种新语法,您可以将不同的对象连接/合并为一个对象,如下所示:

const result = {
  ...obj1,
  ...obj2,
};

5 -

将两个或多个对象的内容合并到第一个对象中。

const target = {};

$.extend(target, obj1, obj2);

6 -

将两个或多个对象的内容深度合并到目标中。不支持为第一个参数传递false

const target = {};

$.extend(true, target, obj1, obj2);

7 - :也称为_.extend

const result = {};

_.assignIn(result, obj1, obj2);

8 -

const result = _.merge(obj1, obj2);

Object.assign**:**的合并功能和之间有几个重要的区别

1-虽然它们都可以接收任意数量的对象,但是lodash的merge会对这些对象进行深度合并,但Object.assign只会合并第一层。例如:

_.isEqual(_.merge({
  x: {
    y: { key1: 'value1' },
  },
}, {
  x: {
    y: { key2: 'value2' },
  },
}), {
  x: {
    y: {
      key1: 'value1',
      key2: 'value2',
    },
  },
}); // true

但是:

const result = Object.assign({
  x: {
    y: { key1: 'value1' },
  },
}, {
  x: {
    y: { key2: 'value2' },
  },
});
_.isEqual(result, {
  x: {
    y: {
      key1: 'value1',
      key2: 'value2',
    },
  },
}); // false
// AND
_.isEqual(result, {
  x: {
    y: {
      key2: 'value2',
    },
  },
}); // true

2-另一个差异与Object.assign_.merge如何解释undefined值有关:

_.isEqual(_.merge({x: 1}, {x: undefined}), { x: 1 }) // false

但是:

_.isEqual(Object.assign({x: 1}, {x: undefined}), { x: undefined })// true

更新1:

当在JavaScript中使用for in循环时,我们应该意识到我们的环境,特别是JavaScript类型中可能的原型更改。例如,一些较旧的JavaScript库在Array.prototype甚至Object.prototype中添加了新的东西。为了保护你的迭代不受添加的东西的影响,我们可以使用object.hasOwnProperty(key)来确保键实际上是你正在迭代的对象的一部分。

更新2:

我更新了我的答案,并添加了4号解决方案,这是一个新的JavaScript功能,但还没有完全标准化。我将它与Babeljs一起使用,这是一个用于编写下一代JavaScript的编译器。

更新3:

我添加了Object.assign_.merge之间的区别。

票数 238
EN

Stack Overflow用户

发布于 2014-01-30 15:42:42

使用Jquery最简单的方法:

var finalObj = $.extend(obj1, obj2);

如果没有Jquery -

var finalobj={};
for(var _obj in obj1) finalobj[_obj ]=obj1[_obj];
for(var _obj in obj2) finalobj[_obj ]=obj2[_obj];
票数 15
EN

Stack Overflow用户

发布于 2016-05-16 17:29:58

1)

var merged = {};
for(key in obj1)
    merged[key] = obj1[key];
for(key in obj2)
    merged[key] = obj2[key];

2)

var merged = {};
Object.keys(obj1).forEach(k => merged[k] = obj1[k]);
Object.keys(obj2).forEach(k => merged[k] = obj2[k]);

Object.keys(obj1)
    .concat(Object.keys(obj2))
    .forEach(k => merged[k] = k in obj2 ? obj2[k] : obj1[k]);

3)最简单的方式:

var merged = {};
Object.assign(merged, obj1, obj2);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21450060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档