如何在IE 11中合并对象

时间:2017-02-07 13:52:40

标签: javascript object internet-explorer-11

我有以下对象数组:

Objs[0] = {Name : "ABC"};
Objs[1] = {Roll : 123}

我试图将其作为以下内容:

Objs {
  Name : "ABC",
  Roll : 123
}

我尝试使用以下代码制作它:

var Objs = [{
  Name: "ABC"
}, {
  Roll: 123
}];

console.log(
  Object.assign.apply(null, [{}].concat(Objs)) // 1
)
or 

console.log(
  Object.assign({}, ...Objs) // 2
)

问题是这在IE 11中不起作用。

我收到了错误:

  

错误1:无法获得属性' on'未定义或空引用

     

2的错误:对象不支持属性或方法'分配'

关于如何在IE 11中合并对象的任何建议?

9 个答案:

答案 0 :(得分:42)

您可以使用在IE 11中工作的jQuery方法$.extend()



var object = {name: 'John', surname: 'Rowland'};
var newObject = $.extend({}, object);

newObject.age = '30';

console.log(object);
console.log(newObject)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:30)

IE11不支持Object.assign

您可以迭代数组和键,并将值作为结果对象的新属性。

&#13;
&#13;
var objs = [{ Name: "ABC" }, { Roll: 123 }],
    result =  objs.reduce(function (r, o) {
        Object.keys(o).forEach(function (k) {
            r[k] = o[k];
        });
        return r;
    }, {});

console.log(result);
&#13;
&#13;
&#13;

答案 2 :(得分:11)

安装:

npm i -s babel-polyfill

在条目 index.js 文件的顶部添加:

import 'babel-polyfill'

这将解决Babel没有解决的一些问题。 Object.assign 就是其中之一。

  

这意味着你可以使用像Promise或WeakMap这样的新内置函数static   像Array.from或Object.assign这样的方法,像   Array.prototype.includes和生成器函数(假设您使用   再生器插件)。 polyfill也增加了全球范围   为了做到这一点,像String这样的原生原型。

最后,您应该确定要使用整个 babel-polyfill (最小化约50kb)的天气,或者仅使用通过单个polyfill所需的天气,即。承诺的 es6-promise

答案 3 :(得分:3)

我认为最好的办法是,如果你在项目中使用lodash util库,那就是lodash的 assign 方法,它与所有浏览器的Object.prototype.assign相同,包括IE(at至少IE11):https://lodash.com/docs/4.17.4#assign

如果你还没有使用lodash,请考虑一下。它有许多util函数,可以在所有浏览器上完美地运行,无论是在JavaScript,TypeScript和NodeJS中(由我自己测试,但它可能也支持其他JS连接技术)。我个人将lodash包含在我所有的javascript连接项目中

答案 4 :(得分:0)

使用这样的polyfill;参考:MDN

 if (typeof Object.assign != 'function') {
  // Must be writable: true, enumerable: false, configurable: true
  Object.defineProperty(Object, "assign", {
    value: function assign(target, varArgs) { // .length of function is 2
      'use strict';
      if (target == null) { // TypeError if undefined or null
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var to = Object(target);

      for (var index = 1; index < arguments.length; index++) {
        var nextSource = arguments[index];

        if (nextSource != null) { // Skip over if undefined or null
          for (var nextKey in nextSource) {
            // Avoid bugs when hasOwnProperty is shadowed
            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
              to[nextKey] = nextSource[nextKey];
            }
          }
        }
      }
      return to;
    },
    writable: true,
    configurable: true
  });
}

答案 5 :(得分:0)

如果您使用TypeScript,则可以使用

let newObject = {
    ...existingObject
}

这将创建现有对象的浅表副本。

答案 6 :(得分:0)

即使是通天塔:

const newObj = Object.assign({}, myOtherObject)

在IE11中摧毁了我们。

我们将其更改为:

const newObj = { ...myOtherObject }

并且与babel一起工作。

答案 7 :(得分:-1)

除了@vladatr之外,以防您使用Wepack:

在您的webpack.config.js中

const path = require("path");
module.exports = {
  entry: ["babel-polyfill", path.resolve(__dirname, "../src/index.js")],
  .
  .

在我的入口点src/index.js文件中:

import "babel-polyfill";

答案 8 :(得分:-1)

如果您使用的是TypeScript,请尝试将Object.assign({}, ...Objs)替换为{...Objs};,浏览器将自动将其替换为__assign({}, Objs);,并且该注意事项在IE11中有效。