Javascript - Объединение массивов и сохранение индексов - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь объединить 3 массива объектов, сохраняя те же индексы исходного массива. Я могу сделать это sh с помощью метода spread operator. Моя текущая проблема заключается в том, что у меня возникла проблема с inte rnet explorer из-за его совместимости. Мне не удалось найти другой способ сделать это без использования метода spread operator. Можно ли это сделать с помощью метода, совместимого с inte rnet explorer?

Вот текущий код, который я использую:

const revenueArr = [{title: 'online', revenue: 34321, revenueGrowth: 3.2},{title: 'retail', revenue: 321, revenueGrowth: 1.2} ] 

const employArr = [ { employGrowth: 0.2 }, {employGrowth: -1.2} ]


const businessArr = [ {businessGrowth: 2.8}, {businessGrowth: 1.6} ] 


const allData = revenueArr.map((it, index) => {
    return { ...it, ...employArr[index], ...businessArr[index]}
}) 

console.log(allData)

Мой ожидаемый результат - это console.log выше во фрагменте кода, где первый индекс объектов остается первым индексом после их объединения. Например:

[
  {
    "title": "online",
    "revenue": 34321,
    "revenueGrowth": 3.2,
    "employGrowth": 0.2,
    "businessGrowth": 2.8
  },
  {
    "title": "retail",
    "revenue": 321,
    "revenueGrowth": 1.2,
    "employGrowth": -1.2,
    "businessGrowth": 1.6
  }
]

Ответы [ 3 ]

3 голосов
/ 04 августа 2020

Вы можете использовать Object.assign() как замену оператору спреда. Object.assign() также недоступен в Inte rnet Explorer, но вы можете использовать polyfill , так как это не новый синтаксис.

// Object.assign polyfill for Internet Explorer

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 || target === undefined) {
        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 && nextSource !== undefined) { 
          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
  });
}

const revenueArr = [{title: 'online', revenue: 34321, revenueGrowth: 3.2},{title: 'retail', revenue: 321, revenueGrowth: 1.2} ] 

const employArr = [ { employGrowth: 0.2 }, {employGrowth: -1.2} ]


const businessArr = [ {businessGrowth: 2.8}, {businessGrowth: 1.6} ] 


const allData = revenueArr.map((it, index) => {
    return Object.assign({}, it, employArr[index], businessArr[index]);
}) 

console.log(allData)
0 голосов
/ 04 августа 2020

это должно поддерживаться везде:

revenueArr.map((it, index) => {
    let r = {};
    for(let [key, value] of Object.entries(it))
        r[key] = value;
    for(let [key, value] of Object.entries(employArr[index]))
        r[key] = value;
    for(let [key, value] of Object.entries(businessArr[index]))
        r[key] = value;
    return r;
}) 

с использованием следующего полифила:

if (!Object.entries)
  Object.entries = function( obj ){
    var ownProps = Object.keys( obj ),
        i = ownProps.length,
        resArray = new Array(i); // preallocate the Array
    while (i--)
      resArray[i] = [ownProps[i], obj[ownProps[i]]];

    return resArray;
  };

(Кредиты: @ jfriend00 )

0 голосов
/ 04 августа 2020

Object.assign должен дать вам тот же результат с поддержкой устаревших браузеров.

const allData1 = revenueArr.map((it, index) => {
  return { ...it, ...employArr[index], ...businessArr[index] } // using spread
})

console.log(allData1)

const allData2 = revenueArr.map((it, index) => {
  return Object.assign({}, it, employArr[index], businessArr[index]) // using Object.assign
})

console.log(allData2) // same as allData1

Вы можете найти это полезным https://thecodebarbarian.com/object-assign-vs-object-spread.html

...