Я знаю, что этот вопрос слишком стар, но я не видел никакой реализации, подобной моей. Эта версия основана на символе преобразования Шварца .
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'));
Я уверен, что нет. Из 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>