Переформатировать массив объектов в массив массивов ключей - PullRequest
0 голосов
/ 27 апреля 2018

Итак, я новичок в Javascript, но я пытаюсь переформатировать startArray в endArray. StartArray - это, в основном, массив объектов порядка, которые всегда будут иметь разные порядковые номера, но могут иметь одинаковый идентификатор компании. Я в основном пытаюсь переключить его так, чтобы он основывался на компании, и чтобы для каждого идентификатора компании существовал массив всех заказов этих компаний. Я возился и пытался понять это, но, честно говоря, я не уверен, с чего начать или возможна ли эта манипуляция.

Я работаю над сценариями Google Apps, которые, я думаю, все еще используют синтаксис ES5, и я предпочел бы придерживаться ванильного javascript, если это вообще возможно.

var startArray = [
    {"companyId" : 1,
     "orderId" : 25,
     "product" : "productA"
     "quantity" : 2,
     "price" : 10,
    },
    {"companyId" : 1,
     "orderId" : 20,
     "product" : "productB"
     "quantity" : 3,
     "price" : 5,
    },
   {"companyId" : 2,
     "orderId" : 15,
     "product" : "productA"
     "quantity" : 5,
     "price" : 10,
    }
 ]

 var endArray = [ {
      '1' = [{"orderId" : 25,
         "product" : "productA"
         "quantity" : 2,
         "price" : 10,},
         {"orderId" : 20,
          "product" : "productB"
          "quantity" : 3,
          "price" : 5,}
      },{
     '2' = [{"orderId" : 15,
          "product" : "productA"
          "quantity" : 5,
          "price" : 10,
         }]
   }]


 ]

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Используйте что-то вроде reduce для создания нового объекта, вставив массив в качестве ключа companyId, если он еще не существует:

function reduce(arr, callback, initialVal) {
  var accumulator = (initialVal === undefined) ? undefined : initialVal;
  for (var i = 0; i < arr.length; i++) {
    if (accumulator !== undefined)
      accumulator = callback.call(undefined, accumulator, arr[i], i, this);
    else
      accumulator = arr[i];
  }
  return accumulator;
}

var startArray = [
  {"companyId" : 1,
   "orderId" : 25,
   "product" : "productA",
   "quantity" : 2,
   "price" : 10,
  },
  {"companyId" : 1,
   "orderId" : 20,
   "product" : "productB",
   "quantity" : 3,
   "price" : 5,
  },
  {"companyId" : 2,
   "orderId" : 15,
   "product" : "productA",
   "quantity" : 5,
   "price" : 10,
  }
];

var endObj = reduce(startArray, function (accum, item) {
  var companyId = item.companyId;
  if (!accum[companyId]) accum[companyId] = [];
  delete item.companyId;
  accum[companyId].push(item);
  return accum;
}, {});
console.log(endObj);
0 голосов
/ 27 апреля 2018

Если вы согласны с результатом, являющимся объектом, а не массивом, это должно сделать работу:

var startArray = [
    {"companyId" : 1,
     "orderId" : 25,
     "product" : "productA",
     "quantity" : 2,
     "price" : 10,
    },
    {"companyId" : 1,
     "orderId" : 20,
     "product" : "productB",
     "quantity" : 3,
     "price" : 5,
    },
   {"companyId" : 2,
     "orderId" : 15,
     "product" : "productA",
     "quantity" : 5,
     "price" : 10,
    }
 ];

var ret = {}

startArray.forEach(company => {
  if (!ret[company.companyId]) {
    ret[company.companyId] = [];
  }
  
  ret[company.companyId].push(company);
});

console.log(ret);

Если у вас нет поддержки ES6, просто используйте классический цикл for in вместо forEach.

...