web-dev-qa-db-ja.com

IE 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のエラー:未定義またはnull参照のプロパティ 'on'を取得できません

2のエラー:オブジェクトはプロパティまたはメソッド 'assign'をサポートしていません

IE 11でオブジェクトをマージする方法に関する提案はありますか?

26
David

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);
33
Nina Scholz

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>
44
Nebojsa Sapic

インストール:

npm i -s babel-polyfill

そして、エントリの先頭にindex.js file add:

import 'babel-polyfill'

これにより、バベルがしなかったいくつかの問題が解決されます。 Object.assignはそのうちの1つです。

つまり、PromiseやWeakMapなどの新しいビルトイン、Array.fromやObject.assignなどの静的メソッド、Array.prototype.includesなどのインスタンスメソッド、およびジェネレーター関数(リジェネレータプラグインを使用する場合)を使用できます。これを行うために、ポリフィルは、グローバルスコープに加えて、Stringなどのネイティブプロトタイプを追加します。

最後に、babel-polyfill(最小50kb程度)全体を使用するか、個々のポリフィルで必要なもののみを使用するかを決定する必要があります。 es6-promise Promisesの場合。

11
vladatr

プロジェクトでlodash utilライブラリを使用している場合は、lodashのassignメソッドが最善であると思います。これはObject.prototype.assignと同じように機能します。 IE(少なくともIE11)を含むすべてのブラウザーの場合: https://lodash.com/docs/4.17.4#assign

まだlodashを使用していない場合は、検討してください。 JavaScript、TypeScript、NodeJSのいずれでも、すべてのブラウザーで完全に機能する多くのutil関数があります(自分でテストしましたが、他のJS接続テクノロジーもサポートしています)。個人的に私はすべてのjavascript接続プロジェクトにlodashを含めます

5
bladekp

このようなポリフィルを使用します。参照: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
  });
}
1
oztecnic