![](/img/trans.png)
[英]How to filter deeply nested json by multiple attributes with vue/javascript
[英]Javascript nested objects to JSON: how to filter attributes
我有一个JS对象的层次结构,像这样:
function Obj1(){
this.att1;
this.Obj2Array;
}
function Obj2(){
this.att1;
this.att2;
}
其中Obj1引用了一个Obj2数组。 如您所见,Obj1和Obj2可以具有相似的属性名称。 不保证唯一性。
我想得到Obj1的JSON,我想要排除Obj2的一些属性。 我知道stringify会收到一个替换器函数或数组,而且我已经尝试过但是存在以下问题:
当我使用替换器函数时,如何区分Obj1和Obj2中的属性,即使它们具有相同的名称? 我的最终目标是拥有像Java toString这样的行为,其中每个Object都可以对其属性做出决定:
Obj1.prototype.stringify = function (key, val){
// if own attribute, return val;
// else it is an Obj2 attribute, return Obj2.prototype.stringify(key, val)
}
Obj2.prototype.stringify = function (key, val){
if (key == "att1"){
return "";
} else if (key == "att2"){
return val;
}
}
我想我错过了一个更好的解决方案。
一个很好的解决方案是使用'toJSON'功能!
正如Java的打印操作调用toString,在Javascript中,JSON.stringify函数调用对象的'toJSON'函数。 用户定义的toJSON函数会更改行为,您可以选择每个对象的属性。 它是这样的:
Obj1.prototype.toJSON = function (){
return {
att1: this.att1,
obj2array: this.Obj2Array
};
}
Obj2.prototype.toJSON = function (){
return {
att2: this.att2
};
}
使用它:
var o1 = new Obj1;
// assign anything you want to o1...
JSON.stringify(o1);
阅读你的代码我认为你想要保留Obj1的属性,只获得Obj2不存在的属性。 你可以用next方法做到这一点:
var Obj1 = {
attr1: 'foo'
};
var Obj2 = {
attr1: 'foo2',
attr2: 'bar'
};
// now, c has attr1: 'foo' (from Obj1) and attr2: 'bar' (from Obj2)
var c = Object.assign({}, Obj2, Obj1);
// and finally call json stringify with new object
JSON.stringify(c);
使用Object.assign,您可以克隆或合并对象: https : //developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object/assign
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.