递归搜索对象的值

时间:2016-07-25 01:16:24

标签: javascript object recursion map-function

考虑这个对象:

pa = {
  "133": {
    "B": null,
    "C": {
      "A": null,
      "o": "http://example.com/upn?lmt=1423895085713162"
    }
  },
  "134": {
    "B": null,
    "C": {
      "A": null,
      "o": "http://example.com/upn?lmt=1423895111043714"
    }
  },
  "135": {
    "B": null,
    "C": {
      "A": null,
      "o": "http://example.com/upn?lmt=1423895094505523"
    }
  },
  "136": {
    "B": null,
    "C": {
      "A": null,
      "o": "http://example.com/upn?lmt=1423895096452313"
    }
  }
};

我想创建一个URL数组。通常我可以做类似的事情 这样:

qu = keys(pa).map(ro => pa[ro].C.o);

但是,密钥ABCo可能会发生变化。我可以创建这个数组吗? 其他方式?我想为http:做一个递归的RegEx,但我不确定 如何实现。

3 个答案:

答案 0 :(得分:4)

您可以使用JSON.stringify()String.prototype.match()RegExp /http:\/\/\w+\.\w+\/\w+\?\w+=\d+/g匹配"http:",后跟两个正斜杠,按字,点,字,正斜杠,单词,问号字符,单词,等号,后跟数字。

或者,正如@Sierra http:[^"]+所建议的那样。



var pa = { "133": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895085713162" } }, "134": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895111043714" } }, "135": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895094505523" } }, "136": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895096452313" } } };

var arr = JSON.stringify(pa).match(/http:\/\/\w+\.\w+\/\w+\?\w+=\d+/g);

console.log(arr);




答案 1 :(得分:3)

只是递归搜索它。这是一个例子:

var pa = { "133": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895085713162" } }, "134": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895111043714" } }, "135": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895094505523" } }, "136": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895096452313" } } };

function searchUrl(obj, result) {
    if (typeof result == 'undefined') {
        result = []
    }
    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (typeof obj[key] === 'string' || obj[key] instanceof String) {
                  if (obj[key].startsWith('http://')) {
                        result.push(obj[key]); // handle the url here
                  }
            } else if (obj[key] !== null && typeof obj[key] === 'object') {
                  searchUrl(obj[key], result);
            }
        }
    }
    return result;
}

console.log(searchUrl(pa));

答案 2 :(得分:0)



var pa = { "133": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895085713162" } }, "134": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895111043714" } }, "135": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895094505523" } }, "136": { "B": null, "C": { "A": null, "o": "http://example.com/upn?lmt=1423895096452313" } } };

var urls = [];
function findUrls(obj) {
    for (key in obj) {
        if (typeof obj[key] === "string") {
            if (obj[key].startsWith("http") || obj[key].startsWith("ftp")) {
                urls.push(obj[key]);
            }
        } else if (obj[key] !== null && typeof obj[key] === "object") {
            findUrls(obj[key]);
        }
    }
}

findUrls(pa);

console.log(urls); // array of urls