复杂Javascript对象解析

复杂Javascript对象解析,javascript,xml-parsing,Javascript,Xml Parsing,我有一个xml作为javascript对象。xml看起来像: <map-Map> <map-Entry> <map-Key> <std-String value="responseMessage"></std-String> </map-Key> <map-Value>

我有一个xml作为javascript对象。xml看起来像:

<map-Map>
        <map-Entry>
            <map-Key>
                <std-String value="responseMessage"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="success"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="lastName"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="Page"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="phone"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="860-634-1602"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="fax"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="860-429-5183"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="email"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="larry.page@gmail.com"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="name"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="Alphabets Inc."></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="altPhone"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="860-429-0021"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="billingAddress"></std-String>
            </map-Key>
            <map-Value>
                <map-HashMap>
                    <map-Entry>
                        <map-Key>
                            <std-String value="postalCode"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="94043"></std-String>
                        </map-Value>
                    </map-Entry>
                    <map-Entry>
                        <map-Key>
                            <std-String value="addr1"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="1600 Amphitheatre Pkwy"></std-String>
                        </map-Value>
                    </map-Entry>
                    <map-Entry>
                        <map-Key>
                            <std-String value="addr2"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="Mountain View"></std-String>
                        </map-Value>
                    </map-Entry>
                    <map-Entry>
                        <map-Key>
                            <std-String value="state"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="California"></std-String>
                        </map-Value>
                    </map-Entry>
                    <map-Entry>
                        <map-Key>
                            <std-String value="country"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="Unites States"></std-String>
                        </map-Value>
                    </map-Entry>
                    <map-Entry>
                        <map-Key>
                            <std-String value="city"></std-String>
                        </map-Key>
                        <map-Value>
                            <std-String value="California"></std-String>
                        </map-Value>
                    </map-Entry>
                </map-HashMap>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="dummyList"></std-String>
            </map-Key>
            <map-Value>
                <col-LinkedList>
                    <std-String value="a"></std-String>
                    <std-String value="b"></std-String>
                    <std-String value="c"></std-String>
                </col-LinkedList>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="firstName"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="Larry"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="companyName"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="Google"></std-String>
            </map-Value>
        </map-Entry>
        <map-Entry>
            <map-Key>
                <std-String value="contact"></std-String>
            </map-Key>
            <map-Value>
                <std-String value="sundar.pichai@gmail.com"></std-String>
            </map-Value>
        </map-Entry>
    </map-Map>  
{
             'map-Map':{
                 'map-Entry':{
                     'map-Key':{
                       'std-String':{attributes:{value:'firstName'}}
                       },
                     'map-Value':{
                        'std-String':{attributes:{value:'Larry'}}
                       }
                 }
  }
};  
我想将其转换为简单的键值对,例如:

{'responseMessage':'success', 'lastName':'Page', 'billingAddress':{'postalCode':'321021','addr1':'Mountain View'},'firstName':'Larry'}
请帮助我用逻辑来解析和创建类似的东西,如果它是通用的,这将是很好的,因为节点的嵌套可以在那里。提前谢谢

编辑
我尝试使用递归,虽然我是新手,但这将进入一个无限循环:

function processedResult(map){
    var resultMap   =   {};
    var mapEntry = map['map-Entry'];
   for(x=0; x<mapEntry.length; x++){
    var value = '';
    var child = mapEntry[x];
    var key = child['map-Key']['std-String']['attributes']['value'];
    var valueNode = child['map-Value'];
    if(Object.keys(valueNode)[0] == 'std-String'){
        value = valueNode['std-String']['attributes']['value'];
    }else if(Object.keys(valueNode)[0] == 'map-HashMap'){
        value = processedResult(valueNode['map-HashMap']);
    }
       resultMap[key] = value;
   }
    return resultMap;
}  
将JS对象馈送给此对象时,我陷入了无限循环:

var parse = function (node, obj) {
    //console.dir(node);
    var hashMap;
    // ..
    if ( Object.keys(node)[0] === "map-Map" ) {
        console.log('inside map-Map');
        parse(node["map-Map"],obj);
        return obj;
    }
    // ..
    if ( Object.keys(node)[0] === "map-HashMap" ) {
        console.log('inside map-HashMap');
        //console.log(node);
        hashMap = {};
       _.each(node, function (node) {
            console.log(node);
            parse(node, hashMap);
        });
        //parse(node["map-HashMap"]["map-Entry"], hashMap);
        return hashMap;
    }
    // ..
    if ( Object.keys(node)[0] === "col-LinkedList" ) {
        console.log('inside col-LinkedList');
        return _.reduce(node, function (linkedList, node) {
            linkedList.push(parse(node, {}));
            return linkedList;
        }, []);
    }
    // ..
    if ( Object.keys(node)[0] === "map-Entry" ) {
        console.log('inside map-Entry');
        console.log(node["map-Entry"]);
        for(a=0; a<node["map-Entry"].length; a++){
            obj[parse(node["map-Entry"][a]["map-Key"], obj)] = parse(node["map-Entry"][a]["map-Value"], obj);
        }
        //obj[parse(node["map-Key"], obj)] = parse(node["map-Value"], obj);
        return obj;
    }
    // ..
    if ( Object.keys(node)[0] === "map-Key" ) {
         console.log('inside map-Key');
        return parse(node["map-Key"][0], obj);
    }
    // ..
    if ( Object.keys(node)[0] === "map-Value" ) {
        console.log('inside map-Value');
        return parse(node["map-Value"][0], obj);
    }
    // ..
    if ( Object.keys(node)[0] === "std-String" ) {
        console.log('inside std-String');
        return node["std-String"]["attributes"]["value"];
    }
};
var parse=函数(节点,obj){
//console.dir(节点);
var-hashMap;
// ..
if(对象键(节点)[0]=“映射”){
log(“内部地图”);
解析(节点[“映射”],obj);
返回obj;
}
// ..
if(Object.keys(节点)[0]=“map HashMap”){
log('insidemap HashMap');
//console.log(节点);
hashMap={};
_.每个(节点、功能(节点){
console.log(节点);
解析(节点,hashMap);
});
//解析(节点[“映射HashMap”][“映射条目”],HashMap);
返回hashMap;
}
// ..
if(对象键(节点)[0]=“列链接列表”){
log('insidecollinkedlist');
return u.reduce(节点,函数(linkedList,节点){
push(解析(节点,{}));
返回linkedList;
}, []);
}
// ..
if(对象键(节点)[0]=“映射项”){
console.log(“内部地图条目”);
日志(节点[“映射条目]);
对于(a=0;a
var parse=function)(节点,obj){
console.dir(节点);
var-hashMap;
// ..
如果(node.tagName==“映射”){
_.每个(节点.子节点,函数(节点){
解析(node,obj);
});
返回obj;
}
// ..
if(node.tagName==“映射HashMap”){
hashMap={};
_.每个(节点.子节点,函数(节点){
解析(节点,hashMap);
});
返回hashMap;
}
// ..
if(node.tagName==“col LinkedList”){
return u.reduce(node.children,函数(linkedList,node){
push(解析(节点,{}));
返回linkedList;
}, []);
}
// ..
if(node.tagName==“映射项”){
obj[parse(node.children[0],obj)]=parse(node.children[1],obj);
返回obj;
}
// ..
if(node.tagName==“映射键”){
返回解析(node.children[0],obj);
}
// ..
if(node.tagName==“映射值”){
返回解析(node.children[0],obj);
}
// ..
如果(node.tagName==“标准字符串”){
返回node.getAttribute(“值”);
}
};
var-str='';
var parser=新的DOMParser();
var xml=parser.parseFromString(str,“text/xml”);
log(JSON.stringify(parse(xml.children[0],{}),null,4));
我正在处理xml文档及其节点,但原理应该与解析的JS obj相同。试着检查一下,让我知道它是否可以理解

不确定它是否是cross brwser,应该在chrome中工作


请参阅u.each和u.reduce expl.

能否为源代码提供完整的JS对象XML@RadekMichna谢谢你的回复。我已经在我的问题中添加了整个JS对象。很抱歉,它的格式不正确。好的,谢谢。请看我的answer@RadekMichna嗨,只有一个问题,node.children是否表示该节点的直接子节点?你可以用任何例子来解释。这里你可以检查整个API:。例如:有两个孩子:和。我正在用'dir'函数将节点打印到控制台。如果你点击控制台日志中的任何节点,你可以看到它的整个结构…完美!…它在chrome上也工作得很好..非常感谢!
var parse = function (node, obj) {
    //console.dir(node);
    var hashMap;
    // ..
    if ( Object.keys(node)[0] === "map-Map" ) {
        console.log('inside map-Map');
        parse(node["map-Map"],obj);
        return obj;
    }
    // ..
    if ( Object.keys(node)[0] === "map-HashMap" ) {
        console.log('inside map-HashMap');
        //console.log(node);
        hashMap = {};
       _.each(node, function (node) {
            console.log(node);
            parse(node, hashMap);
        });
        //parse(node["map-HashMap"]["map-Entry"], hashMap);
        return hashMap;
    }
    // ..
    if ( Object.keys(node)[0] === "col-LinkedList" ) {
        console.log('inside col-LinkedList');
        return _.reduce(node, function (linkedList, node) {
            linkedList.push(parse(node, {}));
            return linkedList;
        }, []);
    }
    // ..
    if ( Object.keys(node)[0] === "map-Entry" ) {
        console.log('inside map-Entry');
        console.log(node["map-Entry"]);
        for(a=0; a<node["map-Entry"].length; a++){
            obj[parse(node["map-Entry"][a]["map-Key"], obj)] = parse(node["map-Entry"][a]["map-Value"], obj);
        }
        //obj[parse(node["map-Key"], obj)] = parse(node["map-Value"], obj);
        return obj;
    }
    // ..
    if ( Object.keys(node)[0] === "map-Key" ) {
         console.log('inside map-Key');
        return parse(node["map-Key"][0], obj);
    }
    // ..
    if ( Object.keys(node)[0] === "map-Value" ) {
        console.log('inside map-Value');
        return parse(node["map-Value"][0], obj);
    }
    // ..
    if ( Object.keys(node)[0] === "std-String" ) {
        console.log('inside std-String');
        return node["std-String"]["attributes"]["value"];
    }
};
var parse = function (node, obj) {
    console.dir(node);
    var hashMap;
    // ..
    if ( node.tagName === "map-Map" ) {
        _.each(node.children, function (node) {
            parse(node, obj);
        });
        return obj;
    }
    // ..
    if ( node.tagName === "map-HashMap" ) {
        hashMap = {};
        _.each(node.children, function (node) {
            parse(node, hashMap);
        });
        return hashMap;
    }
    // ..
    if ( node.tagName === "col-LinkedList" ) {
        return _.reduce(node.children, function (linkedList, node) {
            linkedList.push(parse(node, {}));
            return linkedList;
        }, []);
    }
    // ..
    if ( node.tagName === "map-Entry" ) {
        obj[parse(node.children[0], obj)] = parse(node.children[1], obj);
        return obj;
    }
    // ..
    if ( node.tagName === "map-Key" ) {
        return parse(node.children[0], obj);
    }
    // ..
    if ( node.tagName === "map-Value" ) {
        return parse(node.children[0], obj);
    }
    // ..
    if ( node.tagName === "std-String" ) {
        return node.getAttribute("value");
    }
};

var str = '<map-Map><map-Entry><map-Key><std-String value="responseMessage"></std-String></map-Key><map-Value><std-String value="success"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="lastName"></std-String></map-Key><map-Value><std-String value="Page"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="phone"></std-String></map-Key><map-Value><std-String value="860-634-1602"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="fax"></std-String></map-Key><map-Value><std-String value="860-429-5183"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="email"></std-String></map-Key><map-Value><std-String value="larry.page@gmail.com"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="name"></std-String></map-Key><map-Value><std-String value="Alphabets Inc."></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="altPhone"></std-String></map-Key><map-Value><std-String value="860-429-0021"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="billingAddress"></std-String></map-Key><map-Value><map-HashMap><map-Entry><map-Key><std-String value="postalCode"></std-String></map-Key><map-Value><std-String value="94043"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="addr1"></std-String></map-Key><map-Value><std-String value="1600 Amphitheatre Pkwy"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="addr2"></std-String></map-Key><map-Value><std-String value="Mountain View"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="state"></std-String></map-Key><map-Value><std-String value="California"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="country"></std-String></map-Key><map-Value><std-String value="Unites States"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="city"></std-String></map-Key><map-Value><std-String value="California"></std-String></map-Value></map-Entry></map-HashMap></map-Value></map-Entry><map-Entry><map-Key><std-String value="dummyList"></std-String></map-Key><map-Value><col-LinkedList><std-String value="a"></std-String><std-String value="b"></std-String><std-String value="c"></std-String></col-LinkedList></map-Value></map-Entry><map-Entry><map-Key><std-String value="firstName"></std-String></map-Key><map-Value><std-String value="Larry"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="companyName"></std-String></map-Key><map-Value><std-String value="Google"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="contact"></std-String></map-Key><map-Value><std-String value="sundar.pichai@gmail.com"></std-String></map-Value></map-Entry></map-Map>';
var parser = new DOMParser();
var xml = parser.parseFromString(str, "text/xml");    
console.log(JSON.stringify(parse(xml.children[0], {}), null, 4));