2016-05-12 57 views
0

總結:JSON:取映射數據

有三種dropdowns每個levelNum。如levelNum2的下拉列表包含(Department-Unit-1, Department-Unit-2 & Department-Unit-3),levelNum3包含(Division-Unit-1 & Division-Unit-2),levelNum4包含(Business-Unit-1 & Business-Unit-2)

有一個array of objects .Inside每個對象有一個名爲hierarchyLevels每個對象有如下JSON所示在兩個屬性unitName & levelNum一個屬性這又是一個array of objects .Inside。

var data = [{ 
    "hierarchyLevels": [{ 
     "unitName": "Department-Unit-3", 
     "levelNum": 2 
    }, { 
     "unitName": "Division-Unit-2", 
     "levelNum": 3 
    }, { 
     "unitName": "Business-Unit-1", 
     "levelNum": 4 
    }] 
}, { 
    "hierarchyLevels": [{ 
     "unitName": "Department-Unit-1", 
     "levelNum": 2 
    }, { 
     "unitName": "Division-Unit-1", 
     "levelNum": 3 
    }, { 
     "unitName": "Business-Unit-2", 
     "levelNum": 4 
    }] 
}, { 
    "hierarchyLevels": [{ 
     "unitName": "Department-Unit-2", 
     "levelNum": 2 
    }, { 
     "unitName": "Business-Unit-1", 
     "levelNum": 4 
    }] 
}] 

到目前爲止已經試過:

function getMultipleObjectFromList(propertyName, value, list){ 
    return list.filter(function (item) { 
     return item.hierarchyLevels.some(function (level) { 
      return level[propertyName] === value; 
     }); 
    }); 
}; 

var res = getMultipleObjectFromList('unitName','Business-Unit-1',data); 

要求:

我想fetch與另一unitName相關聯的所有unitName。所以,如果我從levelNum4下拉列表中選擇Business-Unit-1,其他低級別下拉菜單會自動與Business-Unit-1 .i.e levelNum3下拉相關unitName填補只包含Division-Unit-2levelNum2下拉列表將包含(Department-Unit-2 & Department-Unit-3)

任何即時幫助將非常可觀。謝謝。

+0

請分享你有什麼到目前爲止已經試過。 –

+0

@BlazeSahlzen,我用'迄今試過'的部分更新了這個問題。 –

+1

用if(tempObj.hierarchyLevels [propertyName] === value)替換if(tempObj [propertyName] == value)是否解決了你的問題?如果它沒有幫助,你可以發佈你的函數的結果應該是什麼樣子?結果物體應具有什麼結構? – iulian

回答

2

您的數據結構比您在功能中處理的級別更多。有你省略的hierarchyLevels屬性,它是一個數組,你不會迭代。

這是一個建議的自適應函數,返回匹配的那些hierarchyLevels。我還添加了一個類似的函數,它在有匹配時返回內部對象,而不是hierarchyLevels陣列。一個可以用來填充你的下拉菜單:

function getMultipleObjectFromList(propertyName, value, list){ 
 
    return list.filter(function (item) { 
 
     return item.hierarchyLevels.some(function (level) { 
 
      return level[propertyName] === value; 
 
     }); 
 
    }); 
 
}; 
 

 
function getDetailFromList(propertyName, value, list){ 
 
    return list.map(function (item) { 
 
     return item.hierarchyLevels.filter(function (level) { 
 
      return level[propertyName] === value; 
 
     }).pop(); // only return single match 
 
    }).filter(function (item) { // exclude null 
 
     return item; 
 
    }); 
 
}; 
 

 

 
var data = [{ 
 
    "hierarchyLevels": [{ 
 
     "unitName": "Department-Unit-3", 
 
     "levelNum": 2 
 
    }, { 
 
     "unitName": "Division-Unit-2", 
 
     "levelNum": 3 
 
    }, { 
 
     "unitName": "Business-Unit-1", 
 
     "levelNum": 4 
 
    }] 
 
}, { 
 
    "hierarchyLevels": [{ 
 
     "unitName": "Department-Unit-1", 
 
     "levelNum": 2 
 
    }, { 
 
     "unitName": "Division-Unit-1", 
 
     "levelNum": 3 
 
    }, { 
 
     "unitName": "Business-Unit-2", 
 
     "levelNum": 4 
 
    }] 
 
}, { 
 
    "hierarchyLevels": [{ 
 
     "unitName": "Department-Unit-2", 
 
     "levelNum": 2 
 
    }, { 
 
     "unitName": "Business-Unit-1", 
 
     "levelNum": 4 
 
    }] 
 
}]; 
 

 
var res = getMultipleObjectFromList('unitName','Business-Unit-1',data); 
 

 
var level2 = getDetailFromList('levelNum', 2, res); 
 

 
var level3 = getDetailFromList('levelNum', 3, res); 
 

 
var output = '<h2>filtered data:</h2>' + JSON.stringify(res, null, 4) + '\n' 
 
      + '<h2>level 2:</h2>' + JSON.stringify(level2, null, 4) + '\n' 
 
      + '<h2>level 3:</h2>' + JSON.stringify(level3, null, 4); 
 

 
document.querySelector('pre').innerHTML = output;
<pre></pre>

+0

不客氣。 – trincot

+0

需要你的小幫助了..現在我面臨兩個組合的問題。現在我想''levelNum2'對象與兩個('levelNum3和levelNum4')映射。例如:如果我從第一個下拉選擇'Business-Unit-2'和第二個下拉選擇'Division-Unit-1'。然後第三個下拉菜單應該只包含與兩者都映射的「Department-Unit-1」。 –

+0

只調用'getMultipleObjectFromList'兩次。首先在'data'上,第二次在第一次調用的結果上。像'res = getMultipleObjectFromList('unitName','Business-Unit-2',getMultipleObjectFromList('unitName','Division-Unit-1',data));'...等等。 – trincot