繁体   English   中英

使用hasOwnProperty的JavaScript / JSON递归逻辑问题

[英]JavaScript / JSON Recursive Logic Issue using hasOwnProperty

这是JSON,具体问题有注释// doesn't get parsed currently

var oarsObject = [{
    "coordinateReferenceSystem": "26782,15851 <-- not in a value",
        "positionReferenceType": "geogWgs84",
        "geogWgs84": {
        "latitude": {
            "value": 0.50018514607964015
        },
            "longitude": {
            "value": -1.587237735514361
        },
            "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": {
        "value": "26782,15851 <-- was in a value"
    },
        "positionReferenceType": {
        "value": "geogWgs84"
    },
        "geogWgs84": {
        "latitude": {
            "value": 0.5001841257180204
        },
            "longitude": {
            "value": -1.5869069927615211
        },
            "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
        "positionReferenceType": "geogWgs84",
        "geogWgs84": {
        "latitude": {
            "value": 0.49997645018241949
        },
            "longitude": {
            "value": -1.5869078356348387
        },
            "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
        "positionReferenceType": "geogWgs84",
        "geogWgs84": {
        "latitude": {
            "value": 0.4999774704207946
        },
            "longitude": {
            "value": -1.5872385394554729
        },
            "height": {
            "value": 0.0
        }
    },
        "nest": {
        "level_1": {
            "child_1": {
                "value": "child_1 <-- level 1",
                "gchild_1": {"value": "gchild_1 <-- level 2"} // doesn't get parsed currently
            },
                "child_2": {
                "gchild_1": {
                    "value": "gchild_1 <-- level 2"
                }
            },
                "child_3": {
                "gchild_2": {
                    "ggchild_1": {
                        "value": "ggchild_1 <-- level 3"
                    }
                }
            }
        }
    }
}];

我以为递归运行得很好,但是随后出现了上述情况,即在存在“值”属性的对象中赋予了其他属性。 我有两种选择,可以以不同的方式吐出JSON,也可以尝试考虑这些极端情况,这对我来说似乎更具可扩展性。 这就是我现在要迭代和递归的方式-

function propertyTest(currentObject) {
    for (var property in currentObject) {
        if (currentObject[property].hasOwnProperty('value')) {
            // if the "value" shoe fits
            $('#method1').append(property + ', ' + currentObject[property].value + '<br />');
        } else if (typeof currentObject[property] === "object") {
            // recurses when needed
            propertyTest(currentObject[property]);
        } else {
            // spits out "valueless" info
            $('#method1').append(property + ' ' + currentObject[property] + '<br />');
        }
    }
}

追加到div只是方便地输出测试的一种方法。代码可能不像现在那样整洁,但是我将在测试后对其进行清理。

问题-如何正确进行递归/迭代,以便可以检索这些边缘情况值? 任何建议或帮助将不胜感激!

小提琴

您可以使用类似

function propertyTest(currentObject) {
    for (var property in currentObject) {
        if (currentObject[property].hasOwnProperty('value')) {
            $('#method1').append(property + ', ' + currentObject[property].value + '<br />');
        } 
        if (typeof currentObject[property] === "object") {
            propertyTest(currentObject[property]);
        } else if(property != 'value') {
            $('#method1').append(property + ' ' + currentObject[property] + '<br />');
        }
    }
}

演示

我可以简化为:

function propertyTest(currentObject, key) {
    for (var property in currentObject) {
        if (typeof currentObject[property] === "object") {
            propertyTest(currentObject[property], property);
        } else {
            $('#method1').append(
                (property=='value' && key ? key+',' : property)
                + ' ' + currentObject[property] + '<br />'
            );
        }
    }
}

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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