在对arcgis进行查询后想要使用 lodash 对查询结果进行深度克隆时,发现 attributes、geometry 等属性均无法被克隆。
    表现结果如下:
    image.png
    但是在查询结果中新增的 renderer 属性却可以被克隆。

    查询结果是一个 FeatureSet 数组,克隆失败的是 featuerSet 里面的 features 属性里面的对应值。下面用 graphic 来表示这个值。

    1. const graphic = res.features[0];
    2. graphic.renderer = { symbol: "hh" };
    3. console.log(graphic);
    4. for(let i in graphic) {
    5. if (Object.getOwnProperty(graphic)) {
    6. console.log(i)
    7. }
    8. }
    9. // constructor
    10. // attributes
    11. // layer
    12. // popupTemplate
    13. // sourceLayer
    14. console.log(Object.keys(graphic); // ["renderer"]
    15. console.log(Object.getOwnPrpertyNames(graphic)); // ["__accessor__", "uid", "renderer", "__ob__"]
    16. console.log(this.$lodash.deepClone(graphic)); // { attributes: null; geometry: null; ... }

    怀疑应该是 arcgis 对 Graphic 这一数据结构进行过特殊的处理。导致克隆不成功。

    于是最终采取的解决方案是:
    将查询到的结果先赋值给一个新对象,再对其进行深拷贝。
    代码如下:

    1. const graphic = res.features[0];
    2. const { attributes, geometry } = graphic;
    3. const obj = {
    4. attributes,
    5. geometry
    6. }
    7. console.log(this.$lodash.deepClone(obj); // 克隆成功

    暂不清楚 arcgis 对 Graphic 这个对象进行过什么特殊的处理导致使用 lodash 库的 deepClone 克隆不成功,但是只要新建一个对象获取 Graphic 里面的属性值,再对这个新对象进行克隆即可解决这一问题。

    另外还有一个解决方案,即:
    arcgis api for js 中关于 Graphic 和 Geometry 类都有提供 clone() 方法,可以实现深度克隆,可以直接调用这个方法实现深度克隆。