Сократите массив объектов до одного объекта и вызовите функцию для каждого отдельного объекта - PullRequest
0 голосов
/ 13 мая 2019

У меня есть массив объектов.Мне нужно преобразовать это в объект объектов.При попытке сделать это мне нужно вызвать другую функцию для каждого объекта.

Не могли бы вы помочь мне с этим?

Код:

function convertData() {
 var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
 arr.items.reduce(function(item, index) {
   return {
    /*for each obj in items call formatItems before assigning it here */
    item: formatItems(item)
   }
 });

  console.log(arr);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  }
}
<button onclick="convertData()">Click me!</button>

Ожидаемый результат:

{
  "0": {
    "type": "string",
    "id": "item-1"
  },
  "1": {
    "type": "string",
    "id": "item-2"
  }
}

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Использование объекта с именами свойств, таких как "0" и "1", действительно подозрительно.Я бы просто продолжал использовать массив, который вы можете легко создать с помощью map (но продолжайте читать для опций объектов, не являющихся массивами):

var result = arr.items.map(formatItems);

Live Пример:

function convertData() {
  var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
  var result = arr.items.map(formatItems);
  console.log(result);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  };
}

convertData();

Но если вам действительно нужен объект не из массива, ваш код довольно близок, если вы действительно хотите использовать reduce;см. комментарии:

var result = arr.items.reduce(function(obj, item, index) {
  //                                   ^^^-- receive the "accumulator" as the first param
  obj[index] = formatItems(item); // Create the property on the object
  return obj;                     // Return the same object
}, {});                           // Start with a blank object

Live Пример:

function convertData() {
  var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
  var result = arr.items.reduce(function(obj, item, index) {
    //                                   ^^^-- receive the "accumulator" as the first param
    obj[index] = formatItems(item); // Create the property on the object
    return obj;                     // Return the same object
  }, {});                           // Start with a blank object
  console.log(result);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  };
}

convertData();

Но , когда вы просто передаете тот же объект из обратного вызова, который вы получаете, reduce isn 'т лучший инструмент.Все, что вам нужно, это простой цикл:

var result = {};
for (const [index, item] of arr.items.entries()) {
  result[index] = formatItems(item);
}

Live Пример:

function convertData() {
  var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
  var result = {};
  for (const [index, item] of arr.items.entries()) {
    result[index] = formatItems(item);
  }
  console.log(result);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  };
}

convertData();

Adiga имеет намного более простой вариант ES2015 + , хотя.


Или, если вам нужноверсия до ES2015:

var result = {};
for (int index = 0; index < arr.items.length; ++index) {
  result[index] = formatItems(arr.items[index]);
}

Live Пример:

function convertData() {
  var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
  var result = {};
  for (var index = 0; index < arr.items.length; ++index) {
    result[index] = formatItems(arr.items[index]);
  }
  console.log(result);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  };
}

convertData();
2 голосов
/ 13 мая 2019

В ES6 вы можете map arr.items и распространять результирующий массив внутри {}.Это создает объект с индексами массива в качестве свойств

function formatItems(item, index) {
  return { type: "string", id: "item-"+index }
}

const arr = { "items": [ {"type": "color"}, {"type": "number" }] };

const output = { ...arr.items.map(formatItems) } 
      
console.log(output)
0 голосов
/ 13 мая 2019

Вам нужно передать initialValue как пустое object в редуктор.

Пример:

function convertData() {
 var arr = {"items": [ {"type": "color"}, {"type": "number" }]};
 const res = arr.items.reduce(function(acc, item, index) {
    const out = formatItems(item, index)

    //change this if you need an indexed keys, like acc[index] = out
    acc[out.id] = out
    return acc
 }, {});

   console.log(res);
}

function formatItems(item, index) {
  return {
    type: "string",
    id: "item-"+index
  }
}
convertData()
...