2016-12-24 162 views
0

我從凱羅斯人臉檢測API此JSON對象:什麼是重構結構數組的最佳方式?

"landmarks":[ 
    {"leftEyeBrowOuterLeft":{"x":38,"y":76}}, 
    {"leftEyeBrowInnerLeft":{"x":47,"y":74}}, 
    {"leftEyeBrowInnerRight":{"x":56,"y":76}}, 
    {"leftEyeBrowOuterRight":{"x":65,"y":80}}, 
    {"rightEyeBrowOuterLeft":{"x":78,"y":78}}, 
... 
    {"lowerLipTopInnerLeft":{"x":68,"y":139}}] 

要畫它,我不知道如何訪問以另一種方式比這個數據:

var p=json.frames[0]["people"][0]["landmarks"]; 
context.beginPath(); 
context.lineTo(p[0].leftEyeBrowOuterLeft.x,p[0].leftEyeBrowOuterLeft.y); 
context.lineTo(p[3].leftEyeBrowOuterRight.x,p[3].leftEyeBrowOuterRight.y); 
context.stroke(); 

我想最好的方式將是擺脫陣列結構?!所以它看起來是這樣的:

... 
context.lineTo(p.leftEyeBrowOuterLeft.x,p.leftEyeBrowOuterLeft.y); 
... 

但是我該如何重新排列呢?

+0

我不知道,如果[這個問題](http://stackoverflow.com/questions/11922383/access-process-nested-objects- array-or-json)是一個dup,但它無論如何都是有用的。 – Teemu

+1

你在問什麼沒有意義。你可能需要數組或不需要單個元素或多個元素。首先決定你需要什麼。數組沒有錯。 – dfsq

+0

顯而易見,標題中提出的問題不存在單一的一般答案。 – Pointy

回答

2

假設陣列由API返回的包含有單一屬性的對象在的問題,並沒有屬性名稱是重複的,你可以使用.reduce()到陣列摺疊成一個對象:

var landmarkProps = json.frames[0].people[0].landmarks.reduce(function(o, l) { 
    var properties = Object.keys(l); 
    // should be just one, but just in case check for all properties 
    properties.forEach(function(prop) { 
    // it would be an error here for o[prop] to be already set, 
    // so one could check for that if the API might do that 
    o[prop] = l[prop]; 
    }); 
    return o; 
}, {}); 

這將爲您提供包含數組中所有地標屬性的單個對象,而無需索引到數組中。那結果將是landmarkProps會是什麼樣子:

{ 
    "leftEyeBrowOuterLeft": {"x":38,"y":76}, 
    "leftEyeBrowInnerLeft": "x":47,"y":74}, 
    "leftEyeBrowInnerRight": {"x":56,"y":76}, 
    "leftEyeBrowOuterRight": {"x":65,"y":80}, 
    "rightEyeBrowOuterLeft": {"x":78,"y":78}, 
    // ... 
} 
+0

謝謝@點,這是一個美麗的解決方案,我不能拿出我的自我! ...它的工作原理! :-) – Flemming

相關問題