Den spezifischen JavaScript-Wert eines Objekts basierend auf einem Array von Indizes auswählen

8

Gegeben ein verschachteltes Objekt wie dieses:

%Vor%

und ein Array wie dieses ["bentley", "suppliers", "0", "name"] , gibt es eine existierende Funktion, die das tiefste Element, d. h. pluck_innards(cars, ['bentley', "suppliers", "0", "name"]) , auswählt und das "Sheffield Mines" zurückgibt.

Mit anderen Worten, gibt es eine Funktion (die ich deep_pluck nennen werde) wo

%Vor%

Es scheint mir, dass dies einfach und doch häufig genug ist, um es wahrscheinlich in einer der JavaScript-Dienstprogrammbibliotheken wie jQuery getan zu haben oder lo-Dash / unterstreichen - aber ich habe es nicht gesehen.

Mein Gedanke ist etwas Triviales, nach dem Motto:

%Vor%

Ich habe auf jsFiddle gepostet.

Es wäre natürlich hilfreich, wenn die Funktion intelligent genug wäre, um zu identifizieren, wann numerische Indizes in Arrays benötigt werden. Ich bin mir nicht sicher, welche anderen Vorbehalte ein Problem darstellen könnten.

Das ist alles eine ziemlich lange Frage für etwas, von dem ich mir vorstelle, dass es bereits clever gelöst wurde, aber ich dachte, es zu veröffentlichen, da ich daran interessiert wäre zu sehen, welche Lösungen da draußen sind.

    
Brian M. Hunt 08.10.2012, 16:07
quelle

4 Antworten

2

Ich glaube nicht, dass Sie Probleme mit Array-Indizes haben werden, wenn Sie sie als Zahl 0 übergeben.

Hier ist eine alternative Version Ihrer Funktion ohne Rekursion:

%Vor%

Arbeitsbeispiel hier: Ссылка

    
Inferpse 08.10.2012, 16:20
quelle
1

dotty.get (obj, pathspec) tut es und akzeptiert entweder ein Array oder eine gepunktete Zeichenkette als pathspec.

Dotty ist Open Source und hat auch eine exists-Methode und einen Putter.

Die Methode ist eine Rekursion und Ihrer Idee sehr ähnlich, außer dass dotty einen Test für null / undefinierte Objekte enthält, so dass es keine Ausnahmen auslöst, um auf ein Element von etwas zuzugreifen, das nicht existiert.

>

Die dotty.get () - Quelle aus den Dokumenten ist unten aufgeführt:

%Vor%     
Paul 19.07.2013 15:21
quelle
1

Obwohl es sich nicht um eine generische Bibliothek handelt, scheint CasperJS etwas mit seiner utils.getPropertyPath Funktion.

%Vor%

Bearbeiten:

Ich bin auf Implementierungen gestoßen, um das ein paar Mal zu lösen, einschließlich:

  1. das getObject Plugin von Ben Alman (auf Github ).
  2. einen, den ich gerollt habe - siehe gist

Bearbeiten (2014)

Ich würde auch die relativ neue lodash.deep zur Kenntnis nehmen.

    
Brian M. Hunt 12.10.2012 02:23
quelle
0

Hier ist eine kurze ES6-Implementierung mit reduce :

%Vor%

Verwendung:

%Vor%     
Andris Lapsa 14.09.2016 12:21
quelle

Tags und Links