2016-09-23 21 views
1

存在包含其他對象的對象。這個對象的鍵可以是未定義的,定義的或空的。我只對這些鍵的定義值和非空值感興趣。我將展示的例子: 數據對象,我想收集使用遞歸在JavaScript中過濾對象數據

var d = { 
    google: { 
     email: 'zurb @gmail.com', 
     name: 'k-pop Dorama', 
     token: 'ya2XObIhOB63qjwlw', 
     id: '11971093321' 
    }, 
    twitter: { 
     displayName: 'Smart as a Genius', 
     id: '47252187865', 
     name: 'Paul Peter', 
     token: '47252ijoGYJ40bFAKvX' 
    }, 
    facebook: { 
     email: '', 
     id: '1112961258784387', 
     name: 'Tomash Khamlai', 
     token: 'ERUTT8xK2oE7ZD' 
    } 
} 

領域:

var f = ["name", "email"]; 

功能,我試過:

function iterate(data, fields) { 
    var response = Object.create({}, ""); 
    var property; 
    for (property in data) { 
     if (data.hasOwnProperty(property)) { 
      if (typeof data[property] === "object") 
       iterate(data[property], fields); 
      else { 
       fields.forEach(function(element) { 
        if (property === element) { 
         if (data[property] !== "") { 
          if (!response[element]) { 
           response[element] = []; 
           response[element].push(data[property]); 
          } else { 
           response[element].push(data[property]);; 
          } 
         } 
        } 
       }); 
      } 
     } 
    } 
} 

iterate(d, f); 

期望:

console.log(response); 

{ name: ["k-pop Dorama", "Paul Peter", "Tomash Khamlai"], email: ["[email protected]"] } 
+0

它甚至不可訪問。我知道範圍。但我不明白「返回」這個詞應該在哪裏發生,因爲我只理解遞歸的基礎知識。 –

回答

0
function isObj(obj, prop){ 
    return typeof obj[prop] === "object" 
} 

function notContains(array, value){ 
    return !array.includes(value) ; 
} 

function getter(data, fields){ 
    var response = {}; 

    (function iterate(data, fields){ 
     Object.keys(data).forEach(function(prop){ 
      if (isObj(data, prop)) iterate(data[prop], fields); 
      else{ 
       fields.forEach(function (elem){ 
        if(!response[elem]) response[elem] = []; 
        if(!!data[elem] && notContains(response[elem], data[elem])) response[elem].push(data[elem]); 
       }); 
      } 
     }); 
    })(data, fields); 
return response; 
} 

嘿所以我重新編寫了你的​​原代碼與一些輔助函數的可讀性。這應該讓你找到你想要的。

+0

謝謝!我學習了ES6的新方法[Array.prototype.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) 您的解決方案非常好!) –

+0

不客氣! –