У меня есть граф с ребрами, указанными в массиве ссылок. Нижеприведенная функция анализирует узлы из ссылок, но я не совсем понимаю, как это сделать. Какова цель первого предложения в инструкции OR, т.е. link.source = nodes [link.source]?
var links=[{source:"A", target:"B"}, {source:"B", target:"C"}, {source:"D", target:"E"}, {source:"E", target:"C"}];
var nodes=[];
links.forEach(function(link){
link.source = nodes[link.source] || (nodes[link.source]={eid:link.source});
link.target = nodes[link.target] || (nodes[link.target]={eid:link.target});
});
Я новичок в JavaScript и после нескольких попыток отладки, я все еще потерян.
Похоже, вы пытаетесь создать объект nodes
путем итерации по вашему массиву links
, но у вас есть переменная ваших nodes
установленная в пустой массив. Вместо этого вы должны установить его как пустой объект: nodes = {}
. Было бы links.forEach()
обернуть links.forEach()
в функции, поскольку кажется, что идея будет заключаться в ее вызове несколько раз и либо вернуть значение объекта nodes
(если оно было создано), либо создать его, если оно не будет но существуют. Попробуйте пример (добавлены предупреждения, чтобы вы могли увидеть результат кода):
var links = [{
source: "A",
target: "B"
}, {
source: "B",
target: "C"
}, {
source: "D",
target: "E"
}, {
source: "E",
target: "C"
}];
var nodes = {};
links.forEach(function(link) {
link.source = nodes[link.source] || (nodes[link.source] = {
eid: link.source
});
link.target = nodes[link.target] || (nodes[link.target] = {
eid: link.target
});
alert(JSON.stringify(link.source));
alert(JSON.stringify(link.target));
});
alert(JSON.stringify(nodes));
nodes[link.source]
ищет имя в объектеnodes
. Ваша переменнаяnodes
- это пустой массив, поэтому вы ничего не получаете отnodes[link.source]
. Например, при первом проходе циклаlinks.forEach()
link.source == 'A'
, поэтому он ищетnodes['A']
и ничего не находит. Если бы у вас былиnodes = {A:"something"}
, тогда он вернул бы значение. Надеюсь, что вы попадете на правильный путь.