#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:
Возможно, вам захочется сгруппировать значения по ключам
- Используйте цикл forEach через каждый элемент
input
- При каждом элементе попытайтесь собрать имя всех ключей, принадлежащих этому элементу
- Используйте
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);