【问题标题】:How to create an SVG path from an object in vanilla JavaScript?如何从 vanilla JavaScript 中的对象创建 SVG 路径?
【发布时间】:2020-04-19 19:23:06
【问题描述】:

我有一个这样的对象:

{
  12: 46,
  15: 50,
  18: 42,
  21: 45,
  24: 32
}

我想用纯 javascript 创建一个简单的 svg 路径,不需要额外的库。

结果必须如下所示,其中 with 和 height 调整为最大值,路径表示对象值:

<svg width="..." height="..."><path d="M ..."></path></svg>

我尝试了以下代码:

function CreateChart(data) {
    var result = 'M ';
    var array_values = Object.values(data);
    for(var i=1;i<array_values.length;i++){
        result += array_values[i][1]+ ' '+array_values[i][1]+' '
    }
    return result;
}

【问题讨论】:

    标签: javascript svg charts


    【解决方案1】:

    您的主要问题是创建路径字符串(d 属性)。您可以像这样在原版 JS 中执行此操作:

    const coords = [
        [12, 46],
        [15, 50],
        [18, 42],
        [21, 45],
        [24, 32],
    ];
    let d = "";
    let width = 0;
    let height = 0;
    for (x in coords) {
        d += d === "" ? "M" : " L";
        d += `${coords[x][0]} ${coords[x][1]}`;
        maxX = Math.max(width, x);
        maxY = Math.max(height, coords[x]);
    }
    

    现在您有了路径 ("M12 46 L15 50 L18 42 L21 45 L24 32") 以及宽度和高度。只需创建一个 svg 元素并设置宽度和高度。然后创建一个路径,将其 d 属性设置为 d 变量并将其附加到 svg 元素。

    【讨论】:

    • 为什么要把 L 命令放在那里?只需在开头有一个 M,然后将数字添加为坐标对。
    • @RobertLongson 好点。它们似乎没有必要,但我确实认为它们有助于提高可读性。
    • @AxelKöhler,我绝对不会使用对象来存储纵坐标对,因为属性排序不是 ECMAScript 规范的一部分。因此,依赖属性排序可能会导致意外行为。我建议改用元组数组;像这样: [ [12, 46], [15, 50] ]
    • @DavideCannizzo 好点,我已经更新了我的解决方案的代码。另一个好处是可以重复使用 x 坐标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2017-04-22
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多