2016-07-07 84 views
1

對於訪問對象中的對象的多個屬性值,不知道名字

var data = { "title1": {"subtitle1": "one", "subtitle2": "two"}, "title2": "three", "title3": "four" }; 

我可以使用:

for (var key in data) { 
    console.log(key); 
} 

要獲取:

title1 

title2 

title3 

我可以使用:

var key = Object.keys(data)[0]; 

for (var prop in data[key]){ 
    console.log(data[key][prop]); 
} 

要獲取:

one 

two 

問:我可以用什麼來獲得:

one 

two 

three 

four 

回答

2

試試這個

var data = { 
 
    "title1": { 
 
    "subtitle1": "one", 
 
    "subtitle2": "two" 
 
    }, 
 
    "title2": "three", 
 
    "title3": "four" 
 
}; 
 
var output = []; 
 
Object.keys(data).forEach(function(key) { 
 
    if (typeof data[key] == "object") { 
 
    Object.keys(data[key]).forEach(function(innerKey) { 
 
     output.push(data[key][innerKey]) 
 
    }); 
 
    } else { 
 
    output.push(data[key]); 
 
    } 
 
}); 
 
console.log(output);

+0

謝謝,這個作品很棒。所以forEach函數只作用於數組的每個元素?感謝大家誰迴應 – fivedoor

+0

@fivedoor是,在這種情況下,數組的元素是關鍵。 – gurvinder372

0

什麼你要找的是一個遞歸循環。從this SO page:

function eachRecursive(obj) 
{ 
    for (var k in obj) 
    { 
     if (typeof obj[k] == "object" && obj[k] !== null) 
      eachRecursive(obj[k]); 
     else 
      console.log(k, obj[k]); 
    } 
} 

(8號線在這裏,你做你的東西,在這種情況下,我退出鍵和值)

2

您coud使用迭代遞歸方法吧。

function iter(object) { 
 
    Object.keys(object).forEach(function (k) { 
 
     if (typeof object[k] === 'object') { 
 
      iter(object[k]); 
 
      return; 
 
     } 
 
     console.log(object[k]); 
 
    }); 
 
} 
 

 
var data = { "title1": { "subtitle1": "one", "subtitle2": "two" }, "title2": "three", "title3": "four" }; 
 

 
iter(data);

0

你可以試試這個

var data = { "title1": {"subtitle1": "one", "subtitle2": "two"}, "title2": "three", "title3": "four" }; 
function getValues(obj) { 
     var values=[] 
    if (obj){ 
     Object.keys(obj).forEach(function (key) { 
       if (typeof obj[key] == "object"){ 
      values.push(getValues(obj[key])); 
     }else { 
      values.push(obj[key]) 
     } 
      }); 
    } 
    return [].concat.apply([], values); 
} 
console.log(getValues(data)) 
0

您可以使用遞歸函數深入挖掘對象層次結構,並列出所有需要的格式的所有值。這種東西

function getValues(obj) { 
 
    var returnVal = ''; 
 
    if (obj !== null) { 
 
    if (typeof obj === 'object') { 
 
     Object.keys(obj).forEach(function(key) { 
 
     returnVal = returnVal + getValues(obj[key]) + '\n'; 
 
     }); 
 
    } else { 
 
     returnVal = returnVal + obj + '\n'; 
 
    } 
 
    } 
 
    return returnVal; 
 
} 
 

 

 
var data = { 
 
    "title1": { 
 
    "subtitle1": "one", 
 
    "subtitle2": "two" 
 
    }, 
 
    "title2": "three", 
 
    "title3": "four" 
 
}; 
 

 
console.log(getValues(data));

0

如果你想成爲更通用的數據結構,你可以使用JSONPath直接訪問JSON葉子:

當Xpath的所有葉表達//*[not(*)],而在JSONPath中這變成了$..[?(@.length>=0)],所以你有

function jsonPath(obj,expr,arg){var P={resultType:arg&&arg.resultType||"VALUE",result:[],normalize:function(e){var t=[];return e.replace(/[\['](\??\(.*?\))[\]']/g,function(e,r){return"[#"+(t.push(r)-1)+"]"}).replace(/'?\.'?|\['?/g,";").replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,"").replace(/#([0-9]+)/g,function(e,r){return t[r]})},asPath:function(e){for(var t=e.split(";"),r="$",a=1,n=t.length;n>a;a++)r+=/^[0-9*]+$/.test(t[a])?"["+t[a]+"]":"['"+t[a]+"']";return r},store:function(e,t){return e&&(P.result[P.result.length]="PATH"==P.resultType?P.asPath(e):t),!!e},trace:function(e,t,r){if(e){var a=e.split(";"),n=a.shift();if(a=a.join(";"),t&&t.hasOwnProperty(n))P.trace(a,t[n],r+";"+n);else if("*"===n)P.walk(n,a,t,r,function(e,t,r,a,n){P.trace(e+";"+r,a,n)});else if(".."===n)P.trace(a,t,r),P.walk(n,a,t,r,function(e,t,r,a,n){"object"==typeof a[e]&&P.trace("..;"+r,a[e],n+";"+e)});else if(/,/.test(n))for(var l=n.split(/'?,'?/),s=0,c=l.length;c>s;s++)P.trace(l[s]+";"+a,t,r);else/^\(.*?\)$/.test(n)?P.trace(P.eval(n,t,r.substr(r.lastIndexOf(";")+1))+";"+a,t,r):/^\?\(.*?\)$/.test(n)?P.walk(n,a,t,r,function(e,t,r,a,n){P.eval(t.replace(/^\?\((.*?)\)$/,"$1"),a[e],e)&&P.trace(e+";"+r,a,n)}):/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(n)&&P.slice(n,a,t,r)}else P.store(r,t)},walk:function(e,t,r,a,n){if(r instanceof Array)for(var l=0,s=r.length;s>l;l++)l in r&&n(l,e,t,r,a);else if("object"==typeof r)for(var c in r)r.hasOwnProperty(c)&&n(c,e,t,r,a)},slice:function(e,t,r,a){if(r instanceof Array){var n=r.length,l=0,s=n,c=1;e.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g,function(e,t,r,a){l=parseInt(t||l),s=parseInt(r||s),c=parseInt(a||c)}),l=0>l?Math.max(0,l+n):Math.min(n,l),s=0>s?Math.max(0,s+n):Math.min(n,s);for(var o=l;s>o;o+=c)P.trace(o+";"+t,r,a)}},eval:function(x,_v,_vname){try{return $&&_v&&eval(x.replace(/@/g,"_v"))}catch(e){throw new SyntaxError("jsonPath: "+e.message+": "+x.replace(/@/g,"_v").replace(/\^/g,"_a"))}}},$=obj;return expr&&obj&&("VALUE"==P.resultType||"PATH"==P.resultType)?(P.trace(P.normalize(expr).replace(/^\$;/,""),obj,"$"),P.result.length?P.result:!1):void 0} 
 

 
// some extensions I have added to JSONPath 
 
var jsonPathStore = function(obj,path,values) { 
 
var maps=jsonPath(obj, path,{resultType:"PATH"}) 
 
maps.map(function(item,index) { 
 
    return eval('(' + item.replace(/\$/,"obj") + '="' + values[index] +'"' + ')'); 
 
}) 
 
} 
 

 
var jsonPathDelete = function(obj,path) { 
 
var maps=jsonPath(obj, path,{resultType:"PATH"}) 
 
maps.map(function(item,index) { 
 
    return eval('(' + 'delete ' + item.replace(/\$/,"obj") + ')'); 
 
}) 
 
} 
 
var jsonPathRead = function(obj,path) { 
 
var maps=jsonPath(obj, path,{resultType:"PATH"}) 
 
return maps.map(function(item,index) { 
 
    return eval('(' + item.replace(/\$/,"obj") + ')'); 
 
}) 
 
} 
 

 
var data = { "title1": {"subtitle1": "one", "subtitle2": "two"}, "title2": "three", "title3": "four" }; 
 

 
// 
 
// xpath all leaf expression is //*[not(*)] 
 
// in jspath becomes $..[?(@.length>=0)] 
 
var jsonObjectLeafValues = 
 
    jsonPathRead(data,"$..[?(@.length>=0)]"); 
 

 
// this XPath will read all the id properties starting from the root element 
 
console.log(JSON.stringify(jsonObjectLeafValues, null, 2))

此json路徑版本是從原始版本改編的,它可用here