2017-01-11 31 views
1

我試圖顯示一個表,並將其中的一些項目進行比較。我們的想法是正確的方式(較少的左側和右側更完整)進行排序,如:通過子元素的道具排序Json(比較表)

   Plan1 | Plan2 | Plan3 
item1   X  X   X 
item2   -  X   X 
item3   -  -   X 

但是,我們的供應商的API提供的JSON無序。問題是我們有超過100個項目和近20個計劃,所以不可能以「硬編碼」的方式過濾。

的JSON是巨大的,所以簡單的版本,只有最小的是(這樣的例子):

[ 
    { 
     "Id": "1", 
     "Name": "Item1", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    }, 
    { 
     "Id": "2", 
     "Name": "Item2", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    }, 
    { 
     "Id": "3", 
     "Name": "Item3", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    } 
] 

的一點是,我怎樣才能通過JSON導航查詢,如「如何幾件事情我有很多計劃「,」以更少的次數排列計劃「等等......

這種」排序「/」比較「問題是怎麼調用的?我試圖谷歌排序等...並找不到太多。我只想知道如何在javascript中查詢節點,以便能夠實現邏輯。

歡呼

+0

您必須創建自己的排序算法/邏輯,封裝在[.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/排序)數組方法,例如。 – mrlew

回答

1

您可以將計劃視爲二進制數並將其用作排序標準。

var data = [{ "Id": "1", "Name": "Item1", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": true }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": true }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }, { "Id": "2", "Name": "Item2", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": false }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": true }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }, { "Id": "3", "Name": "Item3", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": false }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": false }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }]; 
 

 
data.sort(function (a, b) { 
 
    function getRange(o) { 
 
     var r = o.Plans.reduce(function (r, a) { 
 
       return r * 2 + !a.HasPlan; 
 
      }, 0); 
 
     
 
     o.r = r; // just to show what's happen 
 
     return r; 
 
    } 
 

 
    return getRange(a) - getRange(b); 
 
}); 
 

 
console.log(data)
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

像魅力一樣工作!我以不同的順序放了幾個itens,並正確排序。謝謝妮娜! – 2Fast4YouBR

1

可以定義排序基於一些key功能的陣列的通用功能:

let sortBy = (a, key) => a 
    .map(x => [key(x), x]) 
    .sort((x, y) => x[0] > y[0] ? 1 : x[0] < y[0] ? -1 : 0) 
    .map(x => x[1]); 

然後寫一些特定任務的關鍵功能,例如:

let numberOfPlans = item => item.Plans.filter(x => x.HasPlan).length; 

並將它們傳遞給sortBy

let sortedData = sortBy(data, numberOfPlans); 

另一個(也許更好)選項是將數據加載到關係數據庫(例如, sqlite)並使用SQL的全部功能來檢索您需要的任何內容。

1

你將不得不使用一個循環兩種方式。如果你的JSON和你想要的一樣大,效率是一個問題。你需要盡你所能提高效率。然而,如果你的JSON有100個項目(如你所說),這實際上並不是那麼大的一個數據組。數百萬行的數據集?當然。但是,無論如何(顯然這也是數據集每個項目中有多少嵌套屬性的產物),一百甚至幾千個可能不會帶來太多的性能問題。

至於「導航」的JSON,你需要通過他們爲對象的簡單循環,避免儘可能多的訪問者,你可以(緩存查找等)。

我的硬很少粉絲編碼檢查一個循環哪裏更好,但要記住perf,在某些情況下,如果你完全知道你的數據集是什麼,那麼這樣做是可以接受的,並且perf的好處大於維護好處。

的東西一個例子是更穿孔 - 友好的,但較少的維護友好:

var i; 
var j; 
//Set up a 2-dimensional array where each array index represents the number of plans that each of it's members has. In this case, numPlans[0] contains all items that contain 0 plans, etc. 
var plans = [[], [], []]; 
//Don't re-create variables on every loop, just re-assign 
var item; 
var numPlans; 
var p; 

for(i = 0; i < data.length; i++){ 
    item = data[i]; 
    p = item.Plans; 
    numPlans = 0; 
    for(j = 0; j < p.length; j++) { 
     if(p[j].HasPlan) { 
      numPlans++; 
     } 
    } 
    plans[numPlans].push(item); 
} 

這不是測試,但它是一個粗略的草稿相當導向法律約束的方法。