2016-05-12 14 views
0

Zusammenfassung:JSON: Fetch-Mapping-Daten

Es gibt drei dropdowns für jeden levelNum. Ein Dropdown-Menü für LevelNum2 enthält (Department-Unit-1, Department-Unit-2 & Department-Unit-3), LevelNum3 enthält (Division-Unit-1 & Division-Unit-2) und LevelNum4 enthält (Business-Unit-1 & Business-Unit-2).

Es ist ein array of objects Innerhalb wird jedes Objekt eine Eigenschaft hierarchyLevels benannt ist, die wiederum ein array of objects Innerhalb wird jedes Objekt ein zwei Eigenschaft ist unitName & levelNum wie in unten JSON gezeigt.

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); 

Voraussetzung::

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 
    }] 
}] 

bisher Versuchte

Ich möchte fetch alle mit einem anderen unitName zugeordnet unitName. Also, wenn ich Business-Unit-1 vom levelNum4 Dropdown auswählen, das andere Low-Pegel Dropdown wird automatisch füllen mit unitName im Zusammenhang mit Business-Unit-1 .i.e levelNum3 Dropdown enthalten nur Division-Unit-2 und levelNum2 Dropdown wird (Department-Unit-2 & Department-Unit-3) enthalten.

Jede sofortige Hilfe wird sehr spürbar sein. Vielen Dank.

+0

Bitte teilen, was Sie bisher versucht haben. –

+0

@BlazeSahlzen, habe ich die Frage mit "soweit probiert" Abschnitt aktualisiert. –

+1

Ersetzen Sie 'if (tempObj [propertyName] == value)' mit 'if (tempObj.hierarchyLevels [propertyName] === value)' löst Ihr Problem? Falls es nicht hilft, können Sie aufschreiben, wie das Ergebnis Ihrer Funktion aussehen soll? Welche Struktur sollte das resultierende Objekt haben? – iulian

Antwort

2

Ihre Datenstruktur hat mehr Ebenen als Sie in Ihrer Funktion behandeln. Es gibt die Eigenschaft hierarchyLevels, die Sie weglassen, und es ist ein Array, das Sie nicht iterieren.

Hier ist eine vorgeschlagene angepasste Funktion, die die übereinstimmenden hierarchyLevels zurückgibt. Ich füge auch eine ähnliche Funktion hinzu, die das innere Objekt zurückgibt, wenn es eine Übereinstimmung gibt, anstelle des Arrays hierarchyLevels. Dass man kann verwendet werden, um Ihre Drop-downs zu füllen:

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

Gern geschehen. – trincot

+0

brauche deine kleine Hilfe wieder..nun sehe ich Probleme mit der Kombination von zwei.jetzt möchte ich das 'levelNum2'-Objekt mit beiden (' levelNum3 und levelNum4') verknüpfen. Beispiel: Wenn ich 'Business-Unit-2' aus dem 1. Dropdown und' Division-Unit-1' aus dem zweiten Dropdown-Menü wähle. Das dritte Dropdown sollte dann nur 'Abteilung-Einheit-1' enthalten, die mit beiden zugeordnet ist. –

+0

rufen Sie einfach zweimal 'getMultipleObjectFromList' auf. Zuerst auf "Daten" und das zweite Mal auf das Ergebnis des ersten Anrufs. Etwas wie 'res = getMultipleObjectFromList ('unitName', 'Business-Unit-2', getMultipleObjectFromList ('unitName', 'Division-Unit-1', Daten));' ... etc. – trincot