簡體   English   中英

遞歸地通過Json獲得特定鍵的所有值

[英]Recursively pass through Json to get all values for a specific key

我有一個看起來像這樣的json對象:

var testJ = {"ROOT":{
        dir : 'app',
        files : [
            'index.html',
            {
                dir : 'php',
                files: [
                    'a.php',
                    {
                        dir : 'extras',
                        files : [
                            'a.js',
                            'b.js'
                        ]
                    }
                ]
            }
        ]
    }};

我需要提取所有文件並追加到數組中(index.html,a.php,a.js..etc)

為此,我編寫了一個JavaScript代碼,如下所示:

var arr=[];
    function scan(obj,append)
    {
        var k;
        if (obj instanceof Object) {
            for (k in obj){
                if (obj.hasOwnProperty(k)){
                    if(k=='files')
                    {
                      scan( obj[k],1 );  
                    }


                }                
        }
    } else {
        body += 'found value : ' + obj + '<br/>';
        if(append == 1)
        arr.push(obj);

        alert("Arr"+ arr);
    };

};

scan(testJ,0);

我無法弄清楚我要去哪里。 可以給我一些指示嗎?

var res = [];
function gather(j) {
  for (var k in j) {
    if (k === 'files') {
      addFiles(j[k]);
    } else if (typeof j[k] === 'object') {
      gather(j[k]);
    }
  }
}
function addFiles(f) {
  for (var i = 0; i < f.length; i++) {
    if (typeof f[i] === "string") {
      body += 'found value : ' + obj + '<br/>';
      res.push(f[i]);
    } else {
      gather(f[i]);
    }
  }
}
gather(testJ);

免費提示:

instanceof是一些有毒的東西。 為什么instanceof對某些文字返回false?

始終,總是使用===進行比較,而不是==

我也不會盲目使用hasOwnProperty除非您擔心所操作的東西可能具有經過修改的原型, https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/為了...只是為了簡單。

地圖縮小方法怎么樣?:

function mapJ(subject) {
  return subject.files.map(function(item) {
    if (typeof item === "string") {
      return item;
    } else {
      return parseJ(item);
    }
  });
}

function reduceJ(subject) {
  return subject.reduce(function(prev, cur) {
    return prev.concat(cur);
  }, []);
}

function parseJ(subject) {
  return reduceJ(mapJ(subject));
}

var result = parseJ(testJ));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM