Вложенные деревья графиков?

Я знаю, что этот вопрос слишком стар, но я не видел никакой реализации, подобной моей. Эта версия основана на символе преобразования Шварца .

function sortByAttribute(array, ...attrs) {
  // generate an array of predicate-objects contains
  // property getter, and descending indicator
  let predicates = attrs.map(pred => {
    let descending = pred.charAt(0) === '-' ? -1 : 1;
    pred = pred.replace(/^-/, '');
    return {
      getter: o => o[pred],
      descend: descending
    };
  });
  // schwartzian transform idiom implementation. aka: "decorate-sort-undecorate"
  return array.map(item => {
    return {
      src: item,
      compareValues: predicates.map(predicate => predicate.getter(item))
    };
  })
  .sort((o1, o2) => {
    let i = -1, result = 0;
    while (++i < predicates.length) {
      if (o1.compareValues[i] < o2.compareValues[i]) result = -1;
      if (o1.compareValues[i] > o2.compareValues[i]) result = 1;
      if (result *= predicates[i].descend) break;
    }
    return result;
  })
  .map(item => item.src);
}

Вот пример того, как его использовать:

let games = [
  { name: 'Pako',              rating: 4.21 },
  { name: 'Hill Climb Racing', rating: 3.88 },
  { name: 'Angry Birds Space', rating: 3.88 },
  { name: 'Badland',           rating: 4.33 }
];

// sort by one attribute
console.log(sortByAttribute(games, 'name'));
// sort by mupltiple attributes
console.log(sortByAttribute(games, '-rating', 'name'));

0
задан kdb 13 July 2018 в 20:42
поделиться

1 ответ

Я уверен, что нет. Из https://www.graphviz.org/doc/info/lang.html :

Оператор края разрешает подграф как на левой, так и на правой сторонах краевой оператор. Когда это происходит, ребро создается из каждого узла слева для каждого узла справа.

Это означает, что вам нужно повторить что-то , чтобы не было иметь ребра из ветви (включая корень) в дереве до все на этой ветке. Я обычно прибегаю к повторению узлов, которые легче всего писать.

Я не думаю, что это сделает вас намного счастливее, но вот подход, в котором повторяется только корневой узел:

<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="https://d3js.org/d3.v5.js"></script>
<script src="https://unpkg.com/viz.js@1.8.2/viz.js" type="javascript/worker"></script>
<script src="https://unpkg.com/d3-graphviz@2.4.2/build/d3-graphviz.js"></script>
<div id="graph" style="text-align: center;"></div>
<script>

var dotSrc = `
digraph example {            
    subgraph AA {     
        root -> {a b c}
        a -> {a1 a2 a3}
        b -> {b1 b2 b3}
        c -> {c1 c2 c3}
    }
    subgraph XX {
        _root -> _a -> { _a1 _a2 _a3 }
        _root -> _b -> { _b1 _b2 _b3 }
        _root -> _c -> { _c1 _c2 _c3 }
    }
}
`;

d3.select("#graph").graphviz()
  .engine("twopi")
  .renderDot(dotSrc);

</script>

1
ответ дан magjac 17 August 2018 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: