То, что вы хотите сделать, это создать граф объектов, который вы можете легко сделать с помощью рекурсивного обхода вашего XML-дерева.Каждый объект JavaScript - это карта (иначе говоря, «ассоциативный массив», но мне не нравится этот термин, поскольку они не являются массивами).К свойствам объекта можно получить доступ через пунктирную запись с литералом (obj.foo
), и через []
запись со строкой (obj["foo"]
):
var obj = {}; // A blank object
obj.foo = "bar"; // Now it has a property called "foo"
console.log(obj.foo); // Accessing the property via dotted notation and a literal
console.log(obj["foo"]); // You can also use [] notation and a string
var s = "foo";
console.log(obj[s]); // And of course the string can be the result of any expression,
// including coming from a variable
Вы можете видеть, как нотация []
в сочетании с именем строки может легко использоваться при обходе вашей структуры для построения графика.Вы получите доступ к результату очень похоже на ваш пример, только небольшие различия.Я бы, вероятно, выбрал для карты название коктейльного имени, а затем имел бы свойство ingredients
, в котором перечислены ингредиенты (либо в виде массива объектов, либо просто используя имя ингредиента в качестве ключа).Но вы можете отказаться от свойства ingredients
и вместо этого иметь объект коктейля, содержащий непосредственно ингредиенты, например:
console.log(cocktails["Blue Hawaiian"]["White Rum"].name); // "shot"
console.log(cocktails["Blue Hawaiian"]["White Rum"].quantity); // 1
или, конечно,
var bh = cocktails["Blue Hawaiian"];
console.log(bh["White Rum"].name); // "shot"
console.log(bh["White Rum"].quantity); // 1
множество различных способов структурирования вашего результирующего графа объектов в зависимости от того, как вы хотите получить к нему доступ и от вашего личного стиля.
Составные части:
Созданиеобъект.Это просто:
var obj = {};
Добавление свойства к объекту с помощью точечной нотации литерал свойства:
obj.propertyName = value;
Добавление свойства кобъект с использованием нотации в квадратных скобках с именем свойства, полученным из строкового выражения, а не из литерала:
obj["propertyName"] = value;
// or
var s = "propertyName";
obj[s] = value;
// or even
var s1 = "property", s2 = "Name";
obj[s1 + s2] = value;
В вашем случае вы можете получить имя свойства из XML nodeName
или nodeValue
.
Помещение объекта внутрь другого объекта.На самом деле это просто присваивание свойству, где назначаемое вами значение является ссылкой на объект:
var outer = {};
var inner = {};
inner.foo = "I'm foo"; // Putting the string "I'm foo" on propety `foo`
outer.bar = inner; // Putting the `inner` object on the property `bar`
console.log(outer.bar.foo); // "I'm foo"
Поскольку вы уже знаете, как пройти свой XML, это должно васпродолжая строить граф объектов из результатов этого обхода.Я не пишу реальный код для этого, потому что, опять же, нужно принять много решений относительно того, как вы хотите структурировать свой объектный граф, которые полностью соответствуют тому, как вы хотите это сделать.