395 Stimmen

Führen Sie .join auf Wert in Array von Objekten aus

Wenn ich ein Array von Zeichenfolgen habe, kann ich die .join() Methode verwenden, um eine einzelne Zeichenfolge zu erhalten, wobei jedes Element durch Kommas getrennt ist, wie folgt:

["Joe", "Kevin", "Peter"].join(", ") // => "Joe, Kevin, Peter"

Ich habe ein Array von Objekten und möchte eine ähnliche Operation auf einem darin enthaltenen Wert durchführen; also aus

[
  {name: "Joe", age: 22},
  {name: "Kevin", age: 24},
  {name: "Peter", age: 21}
]

führen Sie die join Methode nur auf dem name Attribut aus, um das gleiche Ergebnis wie zuvor zu erzielen.

Derzeit habe ich die folgende Funktion:

function joinObj(a, attr){
  var out = [];

  for (var i = 0; i < a.length; i++){
    out.push(a[i][attr]);
  }

  return out.join(", ");
}

An diesem Code ist nichts auszusetzen, er funktioniert, aber plötzlich bin ich von einer einfachen, prägnanten Codezeile zu einer sehr imperativen Funktion übergegangen. Gibt es einen prägnanteren, idealerweise funktionaleren Weg, um dies zu schreiben?

9voto

Ed_ Punkte 18355

Ich weiß nicht, ob es einen einfacheren Weg gibt, dies zu tun, ohne eine externe Bibliothek zu verwenden, aber ich persönlich liebe underscore.js, das viele Dienstprogramme zum Umgang mit Arrays, Sammlungen usw. bietet.

Mit Underscore könnten Sie dies leicht mit einer Codezeile tun:

_.pluck(arr, 'name').join(', ')

6voto

C'estLaVie Punkte 243

Sagen wir, dass das Objekt-Array von der Variablen users referenziert wird

Wenn ES6 verwendet werden kann, dann ist die einfachste Lösung:

users.map(user => user.name).join(', ');

Wenn nicht und lodash verwendet werden kann, dann so:

 _.map(users, function(user) {
     return user.name;
 }).join(', ');

3voto

Davron Achilov Punkte 486

Wenn Objekt- und dynamische Schlüssel: "applications\":{\"1\":\"Element1\",\"2\":\"Element2\"}

Object.keys(myObject).map(function (key, index) {
    return myObject[key]
}).join(', ')

1voto

Nigelli Punkte 61

Ein alter Thread, den ich kenne, aber immer noch unglaublich relevant für jeden, der darauf stößt.

Array.map wurde hier vorgeschlagen, was eine großartige Methode ist, die ich die ganze Zeit benutze. Array.reduce wurde auch erwähnt...

Ich persönlich würde für diesen Anwendungsfall ein Array.reduce verwenden. Warum? Trotzdem der Code etwas weniger sauber/klar ist. Es ist viel effizienter als das Verknüpfen der map-Funktion mit einem join.

Der Grund dafür ist, dass Array.map über jedes Element iterieren muss, um ein neues Array mit allen Namen des Objekts im Array zurückzugeben. Array.join durchläuft dann den Inhalt des Arrays, um die Verknüpfung durchzuführen.

Sie können die Lesbarkeit von jakeweirdys reduzierter Antwort verbessern, indem Sie Vorlagenliterale verwenden, um den Code auf eine einzige Zeile zu bringen. "Unterstützt in allen modernen Browsern auch"

// eine einzeilige Antwort auf diese Frage mit modernem JavaScript
x.reduce((a, b) => `${a.name || a}, ${b.name}`);

0voto

Jorge Aguilar Punkte 11

Nicht sicher, aber alle diese Antworten, obwohl sie funktionieren, sind nicht optimal, da sie zwei Scans durchführen und dies in einem einzelnen Scan durchführen können. Obwohl O(2n) als O(n) betrachtet wird, ist es immer besser, ein echtes O(n) zu haben.

const Join = (arr, separator, prop) => {
    let combined = '';
    for (var i = 0; i < arr.length; i++) {
        combined = `${combined}${arr[i][prop]}`;
        if (i + 1 < arr.length)
            combined = `${combined}${separator} `;
    }
    return combined;
}

Dies mag altmodisch aussehen, aber erlaubt es mir, Dinge wie folgt zu tun:

skuCombined = Join(option.SKUs, ',', 'SkuNum');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X