我有以下对象数组:
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中合并对象的任何建议?
答案 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;
答案 1 :(得分:30)
IE11不支持Object.assign
。
您可以迭代数组和键,并将值作为结果对象的新属性。
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;
答案 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中有效。