Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jquery:如何通过转换过滤器值对SVG g元素进行排序?_Javascript_Jquery_Svg - Fatal编程技术网

Javascript Jquery:如何通过转换过滤器值对SVG g元素进行排序?

Javascript Jquery:如何通过转换过滤器值对SVG g元素进行排序?,javascript,jquery,svg,Javascript,Jquery,Svg,您知道如何通过转换x值对SVG组元素进行排序吗? 代码如下: <svg> <g class="element" transform="translate(479, 247) scale(1)">...</g> <g class="element" transform="translate(874, 145) scale(1)">...</g> <g class="element" transform="translate(6

您知道如何通过转换x值对SVG组元素进行排序吗? 代码如下:

<svg>
 <g class="element" transform="translate(479, 247) scale(1)">...</g>
 <g class="element" transform="translate(874, 145) scale(1)">...</g>
 <g class="element" transform="translate(643, 356) scale(1)">...</g>
</svg>
如您所见,每个元素的x值分别为479874和643。 我想按元素的x值对这3个组进行排序,并将其追加回同一个SVG

预期结果:

<svg>
 <g class="element" transform="translate(874, 145) scale(1)">...</g>
 <g class="element" transform="translate(643, 356) scale(1)">...</g>
 <g class="element" transform="translate(479, 247) scale(1)">...</g>
</svg>
您可以使用jQuery排序和一些字符串解析逻辑来检索translate的第一个参数:

您可以使用jQuery排序和一些字符串解析逻辑来检索translate的第一个参数:


如果您对使用大量ES6和功能性想法的稍微不同的方法感兴趣:

我稍微修改了这个示例,通过添加和元素,按照组在SVG上的绘制顺序以及它们在DOM中的显示顺序来显示顺序。所以在它看起来像这样之前:

然后它看起来像这样:

i、 e。。。最后绘制,因为它是标记的最后一个子项

下面是代码,这里是代码笔:

HTML:


您可以调整行返回getValueb[0]-getValuea[0];然后按升序而不是降序排序。此外,您还可以将索引从[0]更改为[1],改为按y平移排序。

如果您对使用大量ES6和功能性想法的稍微不同的方法感兴趣,请:

我稍微修改了这个示例,通过添加和元素,按照组在SVG上的绘制顺序以及它们在DOM中的显示顺序来显示顺序。所以在它看起来像这样之前:

然后它看起来像这样:

i、 e。。。最后绘制,因为它是标记的最后一个子项

下面是代码,这里是代码笔:

HTML:


您可以调整行返回getValueb[0]-getValuea[0];然后按升序而不是降序排序。您还可以将索引从[0]更改为[1],改为按y平移排序。

谢谢您的帮助!我得到的x值是:var pos=$this.position;我可以用它作为pos.top//这将给出x位置值。现在,我想把它分类。我会试试你的答案。谢谢你的帮助!我得到的x值是:var pos=$this.position;我可以用它作为pos.top//这将给出x位置值。现在,我想把它分类。我会试试你的答案。非常感谢@Alex L这太完美了!:非常感谢@Alex L这太完美了!:
function getValue(input){
    return parseInt(input.outerHTML.substring(input.outerHTML.indexOf('(') + 1, input.outerHTML.indexOf(',')));
}

$('svg g').sort(function(a, b) {
     return getValue(a) < getValue(b) ? 1 : -1;
}).appendTo('svg');
<svg width=1000 height="1000">
 <g class="element" transform="translate(479, 247) scale(1)">
   <rect stroke="blue" fill="blue" x="0" y="0" height="200" width="450"/>
   <text>479</text>
  </g>
 <g class="element" transform="translate(874, 145) scale(1)">
   <rect stroke="red" fill="red" x="0" y="0" height="250" width="300"/>
   <text>874</text>
  </g>
 <g class="element" transform="translate(643, 356) scale(1)">
   <rect stroke="green" fill="green" x="0" y="0" height="200" width="350"/>
   <text>643</text>
  </g>
</svg>
const svg = document.querySelector("svg");
const groups = [...document.querySelectorAll("g")];

groups.map(child => {
   console.log(getValue(child))
});

function getValue(child){
  var transform = child.getAttribute("transform")
    .replace("translate(","")
    .replace(/\) scale.*/i,"");
  return transform.split(",")
    .map(el => parseInt(el));
}

groups.sort((a,b) => {
  return getValue(b)[0] - getValue(a)[0];
})

groups.forEach((el,index) => {
  svg.appendChild(el);
});