为了账号安全,请及时绑定邮箱和手机立即绑定

vue2 如何去除带__ob__这样的数据?

vue2 如何去除带__ob__这样的数据?

qq_遁去的一_1 2019-05-24 18:29:05
data:function(){return{cityData:cityData,selectedOptions:this.source[this.schema_key]}}console上面的this.source[this.schema_key]如下[24,81,__ob__:Observer]有么有一种方式可以直接这样获取这样数据[24,81]
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

__ob__:Observer这些数据是vue这个框架对数据设置的监控器,一般都是不可枚举的。
console.log这样的打印函数,被打印的变量会执行自身的toString(),这样,即便内部属性是不可枚举,实际上也能看到。举个例子:
constobj={
a:0,
b:1
};
Object.defineProperty(obj,'b',{
writable:false,
enumerable:false,
configurable:false
});
console.log(obj);//Object{a:0,b:1}
因为你已经将数据绑定在了vue之中,vue就肯定要为数据添加监控器的,如果你强制删掉了这些监控器,那么这些数据也就失去了监控,那么你使用vue的意义何在……
如果仅仅是去掉这些监控器而不考虑后果的话,把对象复制一份就行了,因为复制的对象是不包含不可枚举属性的。
constobj1={
a:0,
b:1
};
Object.defineProperty(obj1,'b',{
writable:false,
enumerable:false,
configurable:false
});
constobj2=Object.assign({},obj1);
console.log(obj2);//Object{a:0}
js这类动态语言,复制对象是个很头疼的事情。我写了个简单的,你可以参考一下:
//对象深复制,不考虑循环引用的情况
functioncloneObj(from){
returnObject.keys(from)
.reduce((obj,key)=>(obj[key]=clone(from[key]),obj),{});
}
//数组深复制,不考虑循环引用的情况
functioncloneArr(from){
returnfrom.map((n)=>clone(n));
}
//复制输入值
functionclone(from){
if(frominstanceofArray){
returncloneArr(from);
}elseif(frominstanceofObject){
returncloneObj(from);
}else{
return(from);
}
}
constobj=[
{
name:'1'
},
{
name:'2'
}
];
constobj2=clone(obj);
console.log(obj2);
在外面直接用clone()方法就行了。
                            
查看完整回答
反对 回复 2019-05-24
?
Qyouu

TA贡献1786条经验 获得超11个赞

今天也遇到了这个问题
JSON.parse(JSON.stringify(arr))
将json数据字符串化再解析之后ob对象就没掉了。。不知道算不算投机取巧。。
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 5182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号