Как бы я преобразовал этот массив массивов в массив объектов, используя функциональный стиль в JavaScript? - PullRequest
0 голосов
/ 03 декабря 2018

Буду признателен за помощь в решении этой проблемы, которую я пытаюсь решить особым образом.Я пытаюсь использовать forEach () и Reduce () для преобразования набора данных из одного формата - массив массивов - в другой - массив объектов.Я знаю, что arr.forEach (i) => {...} будет обращаться к каждому элементу в массиве, тогда я могу использовать arr.reduce (acc, curr) => {...} для преобразования вложенных массивов и их значенийВ объект я испытываю трудности с визуализацией и выяснением того, как использовать .reduce () во вложенном массиве для доступа и, таким образом, назначения пар ключ-значение в объекте.Заранее спасибо за вашу помощь и объяснения.

Вот необработанные данные:

const theData = [
      [
          ["productName", "The Product"], 
          ["productOrigin", "Some Country"], 
          ["productNumber", 100], 
          ["comment", "Some Comment"]
      ],
      [
        ["productName", "Another Product"],
        ["productOrigin", "Some other Country"],
        ["productNumber", 45],
        ["comment", "some comment"]
      ]
    ]

Вывод, для которого я снимаю, таков:

const formattedData = [
  {
    productName: "The Product", 
    productOrigin: "Some Country", 
    productNumber: 100,
    comment: "Some Comment
},
   productName: "Another Product", 
   productOrigin: "Some other Country", 
   productNumber: 45,
   comment: "Some Comment"
}

]

Ответы [ 5 ]

0 голосов
/ 03 декабря 2018

Просто используйте предложенную Object.fromEntries функцию:

const formattedData = theData.map(Object.fromEntries);
0 голосов
/ 03 декабря 2018

Вот один из вариантов, используя Array.prototype.map(), Array.prototype.reduce() и Object.assign():

const theData = [
  [
    ["productName", "The Product"],
    ["productOrigin", "Some Country"],
    ["productNumber", 100],
    ["comment", "Some Comment"]
  ],
  [
    ["productName", "Another Product"],
    ["productOrigin", "Some other Country"],
    ["productNumber", 45],
    ["comment", "some comment"]
  ]
];

const theObjects = theData.map(arr => arr.reduce((acc, val) => Object.assign(acc, {
  [val[0]]: val[1]
}), {}));

console.log(theObjects);
0 голосов
/ 03 декабря 2018

Есть несколько способов сделать это.Одним из способов является это:

const theData = [
      [
          ["productName", "The Product"], 
          ["productOrigin", "Some Country"], 
          ["productNumber", 100], 
          ["comment", "Some Comment"]
      ],
      [
        ["productName", "Another Product"],
        ["productOrigin", "Some other Country"],
        ["productNumber", 45],
        ["comment", "some comment"]
      ]
    ];
    
var formatted = [];   // start with an empty array

theData.forEach(function(arr){   // loop through the outer array level
  
  var obj = {};                  // create a blank object

  arr.forEach(function(row){   // loop through inner array rows

    obj[row[0]] = row[1];       // object's property is zero-th value, and 
                                 // its value is index 1
  });
  formatted.push(obj);           // push the object to the output array
});

console.log(formatted);
0 голосов
/ 03 декабря 2018

Вы можете отобразить новые объекты, указав сопоставленные пары ключ / значение в качестве объектов.

const
    data = [[["productName", "The Product"], ["productOrigin", "Some Country"], ["productNumber", 100], ["comment", "Some Comment"]], [["productName", "Another Product"], ["productOrigin", "Some other Country"], ["productNumber", 45], ["comment", "some comment"]]],
    result = data.map(a => Object.assign(...a.map(([k, v]) => ({ [k]: v }))));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 03 декабря 2018

Использование Array.map , Array.reduce & Object.assign

Использование Array.map ,мы можем преобразовать каждую запись в массиве в другое значение. Здесь в нашем случае мы преобразуем массив в объект.

Для каждого массива (запись в родительском массиве) мы будем использовать Array.reduce , где мы будем уменьшать массив до объекта.Для каждой записи в массиве мы добавляем пару ключ / значение в объект, используя Object.assign

const theData = [[["productName", "The Product"], ["productOrigin", "Some Country"], ["productNumber", 100], ["comment", "Some Comment"]],[["productName", "Another Product"],["productOrigin", "Some other Country"],["productNumber", 45],["comment", "some comment"]]];
    
const result = theData.map(v => v.reduce((a,[k,v]) => Object.assign(a, {[k]:v}), {}));
console.log(result);
...