У меня есть такой массив (который похож на массив JSON) длины n:
const mainData = [
{
phrase: "Phrase 1",
categorynumber: 1,
optionnumber: 1,
},
{
phrase: "Phrase 2",
categorynumber: 1,
optionnumber: 2,
},
{
phrase: "Phrase 3",
categorynumber: 2,
optionnumber: 1,
},
{
phrase: "Phrase 4",
categorynumber: 3,
optionnumber: 1,
},
{
phrase: "Phrase 5",
categorynumber: 3,
optionnumber: 1,
},
{
phrase: "Phrase 6",
categorynumber: 3,
optionnumber: 2,
},
];
Я хотел бы преобразовать его во вложенный объект следующим образом:
jsObject = {
1: {
1: ["Phrase 1"],
2: ["Phrase 2"],
},
2: {
1: ["Phrase 3"],
},
3: {
1: ["Phrase 4", "Phrase 5"],
2: ["Phrase 6"],
},
};
По сути, объект классифицируется в соответствии с categorynumber
, а затем optionnumber
. (Пожалуйста, держите в поле зрения формат «Фраза 4» и «Фраза 5».)
массив уменьшить....
Я ищу способы, как подойти к этому. Я еще не написал никакого конкретного кода.
SO ожидает от пользователей, задающих вопросы, минимальных усилий, чтобы сначала написать код. Добавьте код, который вы пытались использовать, к своему вопросу как минимальный воспроизводимый пример. Вам может быть полезно прочитать сайт раздел помощи, когда речь идет о задать хороший вопрос и этом контрольный список вопросов.
Уменьшать набор данных, обратившись к categorynumber
в качестве основного ключа и optionnumber
в качестве подраздела. Вы можете применить новые параметры к существующей категории с помощью распространение (...
) нового параметра и поместить его в массив.
Если вы добавляете дополнительные фразы, вам также нужно будет захватить существующий массив и распространить новое значение.
const mainData = [
{ phrase: "Phrase 1", categorynumber: 1, optionnumber: 1, },
{ phrase: "Phrase 2", categorynumber: 1, optionnumber: 2, },
{ phrase: "Phrase 3", categorynumber: 2, optionnumber: 1, },
{ phrase: "Phrase 4", categorynumber: 3, optionnumber: 1, },
{ phrase: "Phrase 5", categorynumber: 3, optionnumber: 1, },
{ phrase: "Phrase 6", categorynumber: 3, optionnumber: 2, },
];
const jsObject = mainData.reduce((acc, { phrase, categorynumber, optionnumber }) => ({
...acc,
[categorynumber]: {
...(acc[categorynumber] ?? {}),
[optionnumber]: [...(acc[categorynumber]?.[optionnumber] ?? []), phrase]
}
}), {});
console.info(jsObject);
.as-console-wrapper { top: 0; max-height: 100% !important; }
<!--
jsObject = {
1: {
1: ["Phrase 1"],
2: ["Phrase 2"]
},
2: {
1: ["Phrase 3"]
},
3: {
1: ["Phrase 4", "Phrase 5"],
2: ["Phrase 6"]
}
}
-->
Если вы собираетесь использовать reduce
, возможно, добавьте ссылку на документацию MDN, потому что я сомневаюсь, что ОП поймет, что это такое.
Этот код полностью пропустил «Фразу 4».
Это решение является неполным (кроме должной осмотрительности ОП для них).
@ham17 обновлено, я пропустил распространение массива фраз.
Вкратце, можно ли дать пошаговое руководство, как работает это решение, или, по крайней мере, некоторые ресурсы, где это можно было бы понять более подробно?
Похоже на итерацию и двухэтапное создание/отображение объекта — какая конкретная проблема у вас возникла с вашим кодом? Я не вижу, чтобы это было опубликовано здесь.