在对arcgis进行查询后想要使用 lodash 对查询结果进行深度克隆时,发现 attributes、geometry 等属性均无法被克隆。
表现结果如下:
但是在查询结果中新增的 renderer 属性却可以被克隆。
查询结果是一个 FeatureSet 数组,克隆失败的是 featuerSet 里面的 features 属性里面的对应值。下面用 graphic 来表示这个值。
const graphic = res.features[0];
graphic.renderer = { symbol: "hh" };
console.log(graphic);
for(let i in graphic) {
if (Object.getOwnProperty(graphic)) {
console.log(i)
}
}
// constructor
// attributes
// layer
// popupTemplate
// sourceLayer
console.log(Object.keys(graphic); // ["renderer"]
console.log(Object.getOwnPrpertyNames(graphic)); // ["__accessor__", "uid", "renderer", "__ob__"]
console.log(this.$lodash.deepClone(graphic)); // { attributes: null; geometry: null; ... }
怀疑应该是 arcgis 对 Graphic 这一数据结构进行过特殊的处理。导致克隆不成功。
于是最终采取的解决方案是:
将查询到的结果先赋值给一个新对象,再对其进行深拷贝。
代码如下:
const graphic = res.features[0];
const { attributes, geometry } = graphic;
const obj = {
attributes,
geometry
}
console.log(this.$lodash.deepClone(obj); // 克隆成功
暂不清楚 arcgis 对 Graphic 这个对象进行过什么特殊的处理导致使用 lodash 库的 deepClone 克隆不成功,但是只要新建一个对象获取 Graphic 里面的属性值,再对这个新对象进行克隆即可解决这一问题。
另外还有一个解决方案,即:
arcgis api for js 中关于 Graphic 和 Geometry 类都有提供 clone() 方法,可以实现深度克隆,可以直接调用这个方法实现深度克隆。