2016-07-01 4 views
1

Hier ist der Code für den Anfang;Wie gibt man das Ergebnis von mehr als einem Index innerhalb des mehrdimensionalen Javascript-Arrays zurück?

Plunk

data = { 
 
    "questions": ["Who", "Where", "How"], 
 
    "names": ["Bill", "Fred", "Lindsey"], 
 
    "cities": ["Baltimore", "New York", "Chicago"], 
 

 
    "values": [ 
 
    [ 
 
     [50, 20, 40], 
 
     [40, 90, 10], 
 
     [50, 75, 30] 
 

 
    ], 
 
    [ 
 
     [33, 57, 100], 
 
     [20, 70, 89], 
 
     [16, 40, 68] 
 
    ], 
 
    [ 
 
     [3, 26, 54], 
 
     [62, 69, 86], 
 
     [23, 81, 98] 
 
    ] 
 
    ] 
 
} 
 

 
function sortObject() { 
 
    var values; 
 

 
    var question = data.questions.indexOf("Who", "Where") 
 
    var name = data.names.indexOf("Bill"); 
 
    var city = data.cities.indexOf("Baltimore"); 
 

 
    values = data.values[question][name][city] 
 
    console.log(values) 
 
} 
 

 
sortObject()

Ich möchte in der Lage sein, die Ergebnisse zurück für beide "Who" & "Wo?", Während mit Ausnahme von "Wie".

Das Endergebnis wäre also [50, 33].

Ich möchte auch, dass die Methode mit einer unendlichen Menge von Elementen arbeiten kann, also könnte es zum Beispiel 100 Elemente im "Fragen" -Array geben und ich könnte einzeln auswählen, welche ich möchte zeigen unabhängig von ihrer Position innerhalb des Arrays.

Ich denke, dass ich jedes Element durchlaufen muss und dann vielleicht etwas in der Art von;

for (var question = 0; question < data.questions.length; question++) { 
    if (data.questions.indexOf() == "Who" || "Where") { 
     var name = data.names.indexOf("Bill"); 
     var city = data.cities.indexOf("Baltimore"); 
     values = data.values[question][name][city] 
     console.log(values) 
    } 
    } 

Aber das funktioniert nicht, also bin ich nicht sicher, wo ich von hier aus gehen soll?

Hoffe alles ist klar, bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen;

Vielen Dank im Voraus für jede Hilfe/Beratung!

+0

Mögliche Duplikat [Zugang/Prozess (verschachtelte) Objekte, Arrays oder JSON] (http://stackoverflow.com/questions/11922383/access-process-nested-objects-arrays -oder-json) – Teemu

Antwort

2

Sie über laufen könnten, wenn es mehr als ein Artikel ist zu suchen.

function getData(question, name, city) { 
 
    var result = []; 
 

 
    (Array.isArray(question) ? question : [question]).forEach(function (q) { 
 
     var r = data.values[data.questions.indexOf(q)] || []; 
 
     (Array.isArray(name) ? name : [name]).forEach(function (n) { 
 
      var rr = r[data.names.indexOf(n)] || []; 
 
      (Array.isArray(city) ? city : [city]).forEach(function (c) { 
 
       result.push({ 
 
        question: [q, n, c], 
 
        value: rr[data.cities.indexOf(c)] 
 
       }); 
 
      }); 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
var data = { "questions": ["Who", "Where", "How"], "names": ["Bill", "Fred", "Lindsey"], "cities": ["Baltimore", "New York", "Chicago"], "values": [[[50, 20, 40], [40, 90, 10], [50, 75, 30]], [[33, 57, 100], [20, 70, 89], [16, 40, 68]], [[3, 26, 54], [62, 69, 86], [23, 81, 98]]] }, 
 
    result = getData(["Who", "Where"], "Bill", "Baltimore"); 
 

 
console.log(result);

Eine weitere dynamische Lösung könnte ein iterativer rekursive Ansatz mit einem Suchobjekt sein.

function getData(search) { 
 
    var result = [], 
 
     order = ['questions', 'names', 'cities']; 
 

 
    function iter(value, level) { 
 
     if (level === order.length) { 
 
      return result.push(value); 
 
     } 
 
     search[order[level]].forEach(function (a) { 
 
      iter((value || [])[data[order[level]].indexOf(a)], level + 1); 
 
     }); 
 
    } 
 

 
    iter(data.values, 0); 
 
    return result; 
 
} 
 

 
var data = { "questions": ["Who", "Where", "How"], "names": ["Bill", "Fred", "Lindsey"], "cities": ["Baltimore", "New York", "Chicago"], "values": [[[50, 20, 40], [40, 90, 10], [50, 75, 30]], [[33, 57, 100], [20, 70, 89], [16, 40, 68]], [[3, 26, 54], [62, 69, 86], [23, 81, 98]]] }, 
 
    result = getData({ questions: ["Who", "Where"], names: ["Bill"], cities: ["Baltimore"] }); 
 

 
console.log(result);

+0

Hallo Nina, Danke für die Antwort (en)! Ich habe mit der ersten Lösung herumgespielt und fragte mich, ob es leicht wäre, es auch auf diese Weise in ein Objekt zu verwandeln. so; result.push ({ Frage: Frage, Wert: rr [data.cities.indexOf (c)]}); }) ;. Ich werde jetzt auch die zweite Lösung betrachten, danke, dass Sie sich die Zeit genommen haben, um zu helfen! – since095

+0

wie der erste Vorschlag jetzt? –

+0

Hallo Nina, ich habe eine andere Frage, wenn es in Ordnung ist? Ich habe mich gefragt, ob es möglich sein könnte, zwei Ergebnisse zurückzugeben und dann das Objekt entsprechend zu bearbeiten? z.B; 'resultTest.push ({zeugen})' + 'result.push (do stuff)' mit 'return {result, resultTest};' und dann 'var i = getData();' - 'console.log (d. Ergebnis (["Who", "Where"], "Bill", "Baltimore")); etc usw. [plnk] (http://pnnr.co/edit/lzSOTIjykPRRX0WBmsQX?p=preview). Ich bin mir nicht sicher, ob dies besser als eine andere Frage gedient hätte, oder ob es okay ist, nur in einem Kommentar zu fragen? – since095

0

Versuchen Sie Ihren Code wie folgt zu ändern:

function sortObject() { 
    var values = []; 

    var whoIndex = data.questions.indexOf("Who"); 
    var whereIndex = data.questions.indexOf("Where"); 
    var name = data.names.indexOf("Bill"); 
    var city = data.cities.indexOf("Baltimore"); 

    values.push(data.values[whoIndex][name][city]); 
    values.push(data.values[whereIndex][name][city]); 
    console.log(values); //[50, 33] 
} 
Verwandte Themen