繁体   English   中英

Javascript嵌套对象到JSON:如何过滤属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM