Применение reduce к объекту и получение набора объектов

#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. Удачи в выполнении этого «намного проще».