#javascript #arrays #reactjs #ecmascript-6 #reduce
#javascript #массивы #reactjs #ecmascript-6 #уменьшить
Вопрос:
У меня есть объект, который мне нужно преобразовать, используя reduce, но мне не удается это сделать… У меня есть следующий объект:
const object = {
set: {
subset: [
{
subset_X: 1,
algorithms: [
{
type: "algorithm_A",
params: {
algorithm_A_param_1: 0.1,
algorithm_A_param_2: 0.2
}
},
{
type: "algorithm_B",
params: {
algorithm_B_param_1: 0.3,
algorithm_B_param_2: 0.4
}
}
],
subset_collection: [
{
collection_X: 1,
algorithms: [
{
type: "algorithm_a",
params: {
algorithm_a_param_1: 0.5,
algorithm_a_param_2: 0.6
}
},
{
type: "algorithm_b",
params: {
algorithm_b_param_1: 0.7,
algorithm_b_param_2: 0.8
}
}
],
collection_subcollection: [
{
start: 1,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 10,
algorithm_1_param_2: 20
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 30,
algorithm_11_param_2: 40
}
}
]
},
{
start: 2,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 50,
algorithm_1_param_2: 60
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 70,
algorithm_11_param_2: 80
}
}
]
}
]
},
{
collection_X: 2,
algorithms: [
{
type: "algorithm_a",
params: {
algorithm_a_param_1: 0.9,
algorithm_a_param_2: 1
}
},
{
type: "algorithm_b",
params: {
algorithm_b_param_1: 1.1,
algorithm_b_param_2: 1.2
}
}
],
collection_subcollection: [
{
start: 1,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 90,
algorithm_1_param_2: 100
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 110,
algorithm_11_param_2: 120
}
}
]
},
{
start: 2,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 130,
algorithm_1_param_2: 140
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 150,
algorithm_11_param_2: 160
}
}
]
}
]
}
]
},
{
subset_X: 2,
alg: [
{
type: "algorithm_C",
params: {
algorithm_C_param_1: 1.3,
algorithm_C_param_2: 1.4
}
},
{
type: "algorithm_D",
params: {
algorithm_D_param_1: 1.5,
algorithm_D_param_2: 1.6
}
}
],
subset_collection: [
{
collection_X: 1,
alg: [
{
type: "algorithm_a",
params: {
algorithm_a_param_1: 1.7,
algorithm_a_param_2: 1.8
}
},
{
type: "algorithm_b",
params: {
algorithm_b_param_1: 1.9,
algorithm_b_param_2: 2
}
}
],
collection_subcollection: [
{
start: 1,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 170,
algorithm_1_param_2: 180
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 190,
algorithm_11_param_2: 200
}
}
]
},
{
start: 2,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 210,
algorithm_1_param_2: 220
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 230,
algorithm_11_param_2: 240
}
}
]
}
]
},
{
collection_X: 2,
alg: [
{
type: "algorithm_a",
params: {
algorithm_a_param_1: 2.1,
algorithm_a_param_2: 2.2
}
},
{
type: "algorithm_b",
params: {
algorithm_b_param_1: 2.3,
algorithm_b_param_2: 2.4
}
}
],
collection_subcollection: [
{
start: 1,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 250,
algorithm_1_param_2: 260
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 270,
algorithm_11_param_2: 280
}
}
]
},
{
start: 2,
algorithms: [
{
type: "algorithm_1",
params: {
algorithm_1_param_1: 290,
algorithm_1_param_2: 300
}
},
{
type: "algorithm_11",
params: {
algorithm_11_param_1: 310,
algorithm_11_param_2: 320
}
}
]
}
]
}
]
}
]
}
}
Что мне нужно получить, так это объект с его свойствами / полями в виде конкатенации нескольких полей из исходного объекта: «subset_X:collection_X:start:algorithm_{X}»
Мне нужно получить следующий объект:
{
"1:::algorithm_A": {
algorithm_A_param_1: 0.1,
algorithm_A_param_2: 0.2
},
"1:::algorithm_A": {
algorithm_A_param_1: 0.3,
algorithm_A_param_2: 0.4
},
"1:1:1:algorithm_1": {
algorithm_1_param_1: 10,
algorithm_1_param_2: 20
},
"1:1:1:algorithm_11": {
algorithm_11_param_1: 30,
algorithm_11_param_2: 40
},
"1:1::algorithm_a": {
algorithm_a_param_1: 0.5,
algorithm_a_param_2: 0.6
},
"1:1::algorithm_b": {
algorithm_b_param_1: 0.7,
algorithm_b_param_2: 0.8
},
"1:1:2:algorithm_1": {
algorithm_1_param_1: 50,
algorithm_1_param_2: 60
},
"1:1:2:algorithm_11": {
algorithm_11_param_1: 70,
algorithm_11_param_2: 80
},
"1:2::algorithm_a": {
algorithm_a_param_1: 0.9,
algorithm_a_param_2: 1
},
"1:2::algorithm_b": {
algorithm_b_param_1: 1.1,
algorithm_b_param_2: 1.2
},
"1:2:1:algorithm_1": {
algorithm_1_param_1: 90,
algorithm_1_param_2: 100
},
"1:2:1:algorithm_11": {
algorithm_11_param_1: 110,
algorithm_11_param_2: 120
},
"1:2:2:algorithm_1": {
algorithm_1_param_1: 130,
algorithm_1_param_2: 140
},
"1:2:2:algorithm_11": {
algorithm_11_param_1: 150,
algorithm_11_param_2: 160
},
"2:::algorithm_C": {
algorithm_C_param_1: 1.3,
algorithm_C_param_2: 1.4
},
"2:::algorithm_D": {
algorithm_D_param_1: 1.5,
algorithm_D_param_2: 1.6
},
"2:1:1:algorithm_1": {
algorithm_1_param_1: 170,
algorithm_1_param_2: 180
},
"2:1:1:algorithm_11": {
algorithm_11_param_1: 190,
algorithm_11_param_2: 200
},
"2:1::algorithm_a": {
algorithm_a_param_1: 1.7,
algorithm_a_param_2: 1.8
},
"2:1::algorithm_b": {
algorithm_b_param_1: 1.9,
algorithm_b_param_2: 2
},
"2:1:2:algorithm_1": {
algorithm_1_param_1: 210,
algorithm_1_param_2: 220
},
"2:1:2:algorithm_11": {
algorithm_11_param_1: 230,
algorithm_11_param_2: 240
},
"2:2:1:algorithm_1": {
algorithm_1_param_1: 250,
algorithm_1_param_2: 260
},
"2:2:1:algorithm_11": {
algorithm_11_param_1: 270,
algorithm_11_param_2: 280
},
"2:2::algorithm_a": {
algorithm_a_param_1: 2.1,
algorithm_a_param_2: 2.2
},
"2:2::algorithm_b": {
algorithm_b_param_1: 2.3,
algorithm_b_param_2: 2.4
},
"2:2:2:algorithm_1": {
algorithm_1_param_1: 290,
algorithm_1_param_2: 300
},
"2:2:2:algorithm_11": {
algorithm_11_param_1: 310,
algorithm_11_param_2: 320
}
}
Помогите, пожалуйста: ( Спасибо!
Я пытался получить массив с ключами:
var ruleIds = [...new Set([...object.set.subset.flatMap(subset => subset.algorithms.flatMap(alg => `${subset.subset_X}:::${alg.type}`).concat(subset.subset_collection.flatMap(col => col.algorithms.flatMap(alg => `${subset.subset_X}:${col.collection_X}::${alg.type}`).concat(col.collection_subcollection.flatMap(subCol => subCol.algorithms.flatMap(alg => `${subset.subset_X}:${col.collection_X}:${subCol.startBit}:${alg.type}`))))))])]
Хотел получить:
["1:::algorithm_A", "1:::algorithm_A", "1:1:1:algorithm_1" ..... ]
Но после этого я не знаю, как добавить параметры…
Комментарии:
1. в чем проблема с вашим кодом? вы управляете входным объектом? входной объект и ожидаемый результат демонстрируют непонимание того, как следует использовать объекты и массивы.
2. Я голосую за закрытие этого вопроса, потому что он не включает в себя попытку решить проблему
3. Это не проблема с моим кодом, но после нескольких попыток я попытался преобразовать его, чтобы получить второй объект… Мне не удалось выполнить это: (
4. пожалуйста, укажите попытки кода преобразовать входные данные. где попытки терпят неудачу?
Ответ №1:
Вы можете использовать рекурсию для выполнения обхода в глубину в вашей структуре данных.
Я сделал некоторые предположения о структуре данных, в том числе:
- «листья» этого дерева всегда имеют свойство «params».
- Другие узлы в дереве имеют не более 2 свойств, из которых ровно одно является массивом. Другое необязательное свойство определяет часть для пути
- Поскольку приведенное выше неверно для верхнего узла (поскольку
object
не имеет свойства array), эту реализацию необходимо вызвать с дочерним свойством,object.set
.
Я использовал генератор, поэтому вызываемый может создать из него массив с помощью Array.from
:
function * flatten(object, path = "") {
if ("params" in object) return yield { [path object.type]: object.params };
let entries = Object.entries(object);
if (entries.length > 2 || !entries.length) throw "unexpected object structure";
if (entries.length < 2) entries.unshift(["", ""]); // e.g. "set" has no path-element property
else if (Array.isArray(entries[0][1])) entries.reverse();
let [id, arr] = entries.map(([, v]) => v);
if (!Array.isArray(arr)) throw "unexpected object structure";
for (let child of arr) {
yield * flatten(child, id ? path id ":" : path);
}
}
// The example input given in the question:
const object = {set: {subset: [{subset_X: 1,subset_collection: [{collection_X: 1,collection_subcollection: [{start: 1,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 10,algorithm_1_param_2: 20}},{type: "algorithm_11",params: {algorithm_11_param_1: 30,algorithm_11_param_2: 40}}]},{start: 2,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 50,algorithm_1_param_2: 60}},{type: "algorithm_11",params: {algorithm_11_param_1: 70,algorithm_11_param_2: 80}}]}]},{collection_X: 2,collection_subcollection: [{start: 1,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 90,algorithm_1_param_2: 100}},{type: "algorithm_11",params: {algorithm_11_param_1: 110,algorithm_11_param_2: 120}}]},{start: 2,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 130,algorithm_1_param_2: 140}},{type: "algorithm_11",params: {algorithm_11_param_1: 150,algorithm_11_param_2: 160}}]}]}]},{subset_X: 2,subset_collection: [{collection_X: 1,collection_subcollection: [{start: 1,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 170,algorithm_1_param_2: 180}},{type: "algorithm_11",params: {algorithm_11_param_1: 190,algorithm_11_param_2: 200}}]},{start: 2,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 210,algorithm_1_param_2: 220}},{type: "algorithm_11",params: {algorithm_11_param_1: 230,algorithm_11_param_2: 240}}]}]},{collection_X: 2,collection_subcollection: [{start: 1,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 250,algorithm_1_param_2: 260}},{type: "algorithm_11",params: {algorithm_11_param_1: 270,algorithm_11_param_2: 280}}]},{start: 2,algorithms: [{type: "algorithm_1",params: {algorithm_1_param_1: 290,algorithm_1_param_2: 300}},{type: "algorithm_11",params: {algorithm_11_param_1: 310,algorithm_11_param_2: 320}}]}]}]}]}};
let result = Array.from(flatten(object.set));
console.log(result);
Комментарии:
1. Спасибо за ваш ответ, но я ищу что-то гораздо более простое, например, использование reduce, flatMap… PS: Я изменил объект.. и результат
2. Удачи в выполнении этого «намного проще».