Как передать массив как объект в javascript?

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Таким образом я могу передавать значения массива и его работу

 const obj = [
  { text1: "John", text2: "male" },
  { text1: "Philip", text2: "male" },
  { text1: "Matthew", text2: "male" },
  { text1: "Richard", text2: "male" },
 ];
  

Но мне нужно передать его следующим образом

 var obj = {
    text1: ["John", "Philip", "Matthew", "Richard"],
    text2: ["male", "male", "male", "male"]
};
  

Комментарии:

1.Все ли объекты в исходном массиве имеют только text1 и text2 , или есть другие свойства?

2. только текст 1 и текст2

Ответ №1:

Возможно, вам захочется сгруппировать значения по ключам

  1. Используйте цикл forEach через каждый элемент input
  2. При каждом элементе попытайтесь собрать имя всех ключей, принадлежащих этому элементу
  3. Используйте for...loop имя каждого ключа и проверьте, obj[k] пусто ли оно, тогда мы должны назначить пустой массив и ввести значение с помощью этого ключа( k ) obj[k] .

Это решение

     const input = [
      {text1: 'John', text2: 'male'},
      {text1: 'Philip', text2: 'male'},
      {text1: 'Matthew', text2: 'male'},
      {text1: 'Richard', text2: 'male'},
    ];

    function toKeyArray(array) {
      const obj = {};
      array.forEach(item => {
        const keys = Object.keys(item);
        for (const k of keys) {
          (obj[k] = obj[k] || []).push(item[k]);
        }
      });

      return obj;
    }

    const output = toKeyArray(input);
    console.log(output);
  

Ответ №2:

Мы можем достичь этого с помощью Array.reduce и Object.entries

 const obj = [{text1:"John",text2:"male"},{text1:"Philip",text2:"male"},{text1:"Matthew",text2:"male"},{text1:"Richard",text2:"male"},]

const formatData = (data) => data.reduce((res, obj) => {
  Object.entries(obj).forEach(([key, val]) => {
    res[key] = [...(res[key] || []), val];
  });
  return res;
}, {});


console.log(formatData(obj));  
 .as-console-wrapper {
  max-height: 100% !important;
}  

Ответ №3:

 const input = [
  { text1: "John", text2: "male" },
  { text1: "Philip", text2: "male" },
  { text1: "Matthew", text2: "male" },
  { text1: "Richard", text2: "male" },
 ];

const output = {
    text1: input.map( e => e.text1 ),
    text2: input.map( e => e.text2 )
};
  

Комментарии:

1. есть ли какой-либо способ передать его как массив без повторного ввода text1 и text2

2. @BarryAllen Вам не нужно повторять что-либо, кроме имени каждого свойства дважды (один раз для источника, один раз для назначения) — я что-то упускаю?

3. Нет, @Dai, я понял твою точку зрения . Как, случайно, возможно передать массив в компонент, например, так text1: ["John", "Philip", "Matthew", "Richard"], text2: ["male", "male", "male", "male"] . Два свойства с массивом из четырех / многих элементов.

4. @BarryAllen Что вы подразумеваете под «компонентом»? И код, который я опубликовал, предполагает input , что это ваш obj массив, и он будет корректно обрабатывать массивы любого размера.

5. Хорошо @dai. Спасибо.

Ответ №4:

Используя Array.prototype.reduce , это можно сделать просто.

 const obj = [
  { text1: "John", text2: "male" },
  { text1: "Philip", text2: "male" },
  { text1: "Matthew", text2: "male" },
  { text1: "Richard", text2: "male" },
];

const output = obj.reduce((acc, cur) => {
  Object.keys(cur).forEach((item) => {
    acc[item] ? acc[item].push(cur[item]) : acc[item] = [ cur[item] ];
  });
  return acc;
}, {});
console.log(output);  

Ответ №5:

 const obj = [{
    text1: "John",
    text2: "male"
  },
  {
    text1: "Philip",
    text2: "male"
  },
  {
    text1: "Matthew",
    text2: "male"
  },
  {
    text1: "Richard",
    text2: "male"
  },
];

var output = {}
obj.forEach(item => {
  Object.keys(item).forEach(key => {
    if (!output[key]) output[key] = [];
    output[key].push(item[key])
  })
})
console.log(output);