如何在一个可能具有可变结构的JavaScript对象中通过ID查找对象?

时间:2014-12-15 12:25:18

标签: javascript json

我想知道通过id检索对象的更快方法是什么,并考虑到存储它的结构可能不同。 JS中是否有任何本机函数用于此操作?

示例1

var source = {
    "page": [{
        "id": "1",
        "site": "",
        "items": [{
            "id": "2"
        }, {
            "id": "3",
            "anotherItem": [{
                "id": "4"
            }, {
                "id": "5"
            }]
        }]
    }, {
        "id": "6"
    }]
};

示例2

结构可能完全不同,脚本应始终能够获取包含id的对象。

{
    "smtElse": {
        "id": "1"
    }
}

3 个答案:

答案 0 :(得分:4)

不,没有原生功能。

最快的方法是迭代对象的唯一方法,可能是递归,寻找ID并返回你想要的东西。

答案 1 :(得分:0)

我使用以下脚本解决了,因为似乎没有可用的原生功能。

var data = {
    item: [
        {
            itemNested: [
                {
                    itemNested2: [{
                        id: "2"
                    }
                    ]
                }
            ]
        }
    ]
};

function findById(obj, id) {
    var result;
    for (var p in obj) {
        if (obj.id == id) {
            return obj;
        } else {
            if (typeof obj[p] === 'object') {
                result = findById(obj[p], id);
                if (result) {
                    return result;
                }
            }
        }
    }
    return result;
}


var result = findById(data, "2");
console.log(result);

答案 2 :(得分:-1)

you can try this
<script type="text/javascript">
var re = /"id":\s+"(.*?)"/;
var sourcestring = "source string to match with pattern";
var results = [];
var i = 0;
for (var matches = re.exec(sourcestring); matches != null; matches = re.exec(sourcestring)) {
results[i] = matches;
for (var j=0; j<matches.length; j++) {
  alert("results["+i+"]["+j+"] = " + results[i][j]);
 }
 i++;
}

enter image description here