Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавить объект в другой объект (https://javascript.ru/forum/misc/58791-dobavit-obekt-v-drugojj-obekt.html)

фонарик 10.10.2015 23:30

Добавить объект в другой объект
 
Помогите пожалуйста решить задачу. Есть объект
var materials = {
"Красный кирпич": {"Глина" : 10, "Цемент" : 5, "Вода" : 8},
"Белый кирпич": {"Песок" : 5, "Цемент" : 4,"Вода" : 3}
}
Есть текст:
var string = '[Силикат] состоит из следующих элементов: (Шлак), (Цемент), (Добавки). Практичный стройматериал.'
Регулярным выражением получаем из текста название материала и его составляющие:
var material_name = string.split('[')[1].split(']')[0]; // Силикат
var material_components = string.match(/\([^\)]*\)/g)//(Шлак), (Цемент), (Добавки)
Как объект materials привести к виду типа:
materials = {
"Красный кирпич": {"Глина" : 10, "Цемент" : 5, "Вода" : 8},
"Белый кирпич": {"Песок" : 5, "Цемент" : 4,"Вода" : 3},
"Силикат": {"Шлак", "Цемент", "Добавки"}
}
Можно ли добавить "Силикат" в виде массива? Или только как объект? Просто у компонентов "Шлак", "Цемент", "Добавки" нет значений.

caetus 10.10.2015 23:48

var string = '[Силикат] состоит из следующих элементов: (Шлак), (Цемент), (Добавки). Практичный стройматериал.'
var material_name = string.split('[')[1].split(']')[0]; // Силикат
var material_components = string.match(/\([^\)]*\)/g)//(Шлак), (Цемент), (Добавки)

var materials = {
"Красный кирпич": {"Глина" : 10, "Цемент" : 5, "Вода" : 8},
"Белый кирпич": {"Песок" : 5, "Цемент" : 4,"Вода" : 3}
}



function f (obj,a,b) {
obj[a] = {}
for(var i = 0; i < b.length; i++) obj[a][b[i]] = null;
}


f(materials,material_name, material_components)


alert(JSON.stringify(materials))

фонарик 11.10.2015 00:07

Цитата:

Сообщение от caetus (Сообщение 391520)
var string = '[Силикат] состоит из следующих элементов: (Шлак), (Цемент), (Добавки). Практичный стройматериал.'
var material_name = string.split('[')[1].split(']')[0]; // Силикат
var material_components = string.match(/\([^\)]*\)/g)//(Шлак), (Цемент), (Добавки)

var materials = {
"Красный кирпич": {"Глина" : 10, "Цемент" : 5, "Вода" : 8},
"Белый кирпич": {"Песок" : 5, "Цемент" : 4,"Вода" : 3}
}



function f (obj,a,b) {
obj[a] = {}
for(var i = 0; i < b.length; i++) obj[a][b[i]] = undefined;
}


f(materials,material_name, material_components)


console.log(materials)
alert(JSON.stringify(materials))

Что-то с объектом Силикат не так :(

caetus 11.10.2015 00:22

изменил undefined на null и все заработало :)

фонарик 11.10.2015 00:33

caetus,
спасибо вам большое :)

Vlasenko Fedor 11.10.2015 02:57

var materials = {
    "Красный кирпич": {"Глина" : 10, "Цемент" : 5, "Вода" : 8},
    "Белый кирпич": {"Песок" : 5, "Цемент" : 4,"Вода" : 3}
};
var str = '[Силикат] состоит из следующих элементов: (Шлак), (Цемент), (Добавки). Практичный стройматериал.';
var key = str.split(']', 1)[0].split('[', 2)[1];
materials[key] = {};
str.match(/\(.*?\)/g).forEach(function(el){
    materials[key][el.replace(/(^.|.$)/g, '')] = null;
});
console.dir(materials);
alert(JSON.stringify(materials));

вариант :)


Часовой пояс GMT +3, время: 12:13.