如何将SVGPolyline的点提取为2D数组

时间:2019-06-30 13:07:17

标签: javascript jquery tampermonkey

我的问题是我的脚本没有按照我想要的方式输出数组数据。

您将在这里看到:https://pastebin.com/raw/3AcEs1gc 这显示了它当前的输出方式(在Google控制台中),以及我希望它如何输出。

我的代码显示在最底部。我只需要在数组的开头添加“ [”,并在其末尾添加“]” 我还需要它在每个成对的数字之后添加这些字符,并在每个成对的数字之后用逗号替换空格。 因此,它将输出像这样的示例[[200,100],[250,123]]。 &not like this 200, 400 245, 500 <当前登录Google控制台的方式。

pastebin链接介绍了更多内容。如果您需要更多详细信息,请回复。我会尽力解释。

我的代码:

xhr=new XMLHttpRequest();
// Tell the request where the file is.
xhr.open("GET", "http://someurl.com/blahblah.svg");
// Add event handler to process the file once it's been fetched.
xhr.addEventListener("load", function() {
// Once the text is available, create an XML parser
// and parse the text as an SVG image.
const xmlDoc = new DOMParser().parseFromString(
this.responseText.trim(),
"image/svg+xml"
);
// xmlDoc.getElements() returns something Array-like, but not an Array.
// This turns it into an Array.
const polylines = Array.from(xmlDoc.getElementsByTagName('polyline'));


var Lines = (polylines.map(
pl => [
  // Parses each 'points' attribute into an array of pairs of numbers
  pl.getAttribute('points').split(' ').map(
    pair => pair.split(',').map(x=>+x)
  ),
  // Various stroke information

  // Convert rgb(R,G,B) to #RRGGBB
  // Leading hash, then pull out the digits with a regex
  '#' + pl.style.stroke.match(/rgb\((\d*), (\d*), (\d*)\)/)
    // Throw away everything but the digits
    .slice(1,4)
    // Convert to a number, render in hex, uppercase, pad with 0s
    .map(x=>(+x).toString(16).toUpperCase().padStart(2,'0'))
    // Concatenate the hex digits
    .join(''),
  +pl.style.strokeWidth,

    ]
));
console.log(Lines)  // Logs the arrays to console.
});
xhr.send();

2 个答案:

答案 0 :(得分:1)

使用SVGPolylineElement可用的SVGPointList接口提取其中包含的所有SVGPoints。 然后,您只需要将所有这些SVGPoints xy属性映射到等效的[x, y]数组:

makeSVGPointListIterable();

const polyline = document.querySelector('polyline');
console.log(parsePoints(polyline));

function parsePoints(elem) {
  return [...elem.points] // convert to an Array so we can map its content
    .map((pt) => [pt.x, pt.y]); // convert to an Array
}






// small monkey patch for Safari
function makeSVGPointListIterable() {
  const proto = SVGPointList.prototype;
  if (typeof proto[Symbol.iterator] !== 'function') {
    proto[Symbol.iterator] = function() {
      let current = 0;
      return {
        next: () => {
          const is_done = current === this.numberOfItems;
          return {
            done: is_done,
            value: is_done || this.getItem(current++)
          }
        }
      };
    }
  }
}
<svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
  <!-- even with stoopid new lines in the attribute -->
  <polyline points="100,100 150,25 150,75
    200,0" fill="none" stroke="black" />
</svg>

答案 1 :(得分:0)

您可以使用JSON.stringify()

console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));

将输出以下内容:

“ [3,” false“,false]”