864 Stimmen

Wie erhält man unterschiedliche Werte aus einem Array von Objekten in JavaScript?

Angenommen, ich habe die folgenden Daten:

var array = 
    [
        {"name":"Joe", "age":17}, 
        {"name":"Bob", "age":17}, 
        {"name":"Carl", "age": 35}
    ]

Was ist der beste Weg, um in der Lage sein, ein Array aller unterschiedlichen Alter zu erhalten, so dass ich ein Ergebnis-Array von erhalten:

[17, 35]

Gibt es eine Möglichkeit, ich könnte alternativ die Daten oder bessere Methode strukturieren, so dass ich nicht durch jedes Array Überprüfung der Wert von "Alter" und überprüfen Sie gegen ein anderes Array für seine Existenz, und fügen Sie es, wenn nicht zu iterieren würde?

Wenn es eine Möglichkeit gäbe, einfach die verschiedenen Altersstufen herauszufinden, ohne zu iterieren...

Die derzeitige ineffiziente Methode würde ich gerne verbessern... Wenn es bedeutet, dass anstelle von "Array" ein Array von Objekten, sondern eine "Karte" von Objekten mit einigen eindeutigen Schlüssel (z. B. "1,2,3"), das wäre auch okay. Ich bin nur auf der Suche nach dem leistungsfähigsten Weg.

Das Folgende ist, wie ich es derzeit tun, aber für mich, Iteration scheint nur für die Effizienz crummy sein, obwohl es funktioniert ...

var distinct = []
for (var i = 0; i < array.length; i++)
   if (array[i].age not in distinct)
      distinct.push(array[i].age)

0voto

Akash Singh Punkte 537

Nun können Sie lodash verwenden, um einen Code zu schreiben, der weniger ausführlich ist

Ansatz 1: Verschachtelter Ansatz

    let array = 
        [
            {"name":"Joe", "age":17}, 
            {"name":"Bob", "age":17}, 
            {"name":"Carl", "age": 35}
        ]
    let result = _.uniq(_.map(array,item=>item.age))

Ansatz 2: Methodenverkettung oder Kaskadenmethode

    let array = 
        [
            {"name":"Joe", "age":17}, 
            {"name":"Bob", "age":17}, 
            {"name":"Carl", "age": 35}
        ]
    let result = _.chain(array).map(item=>item.age).uniq().value()

Sie können über die uniq()-Methode von lodash lesen unter https://lodash.com/docs/4.17.15#uniq

0voto

Nina Scholz Punkte 348155

Der Ansatz, um eine Sammlung von eindeutigen Werten aus einer Gruppe von Schlüsseln zu erhalten.

Sie können den angegebenen Code von aquí und fügen Sie eine Zuordnung nur für die gewünschten Schlüssel hinzu, um ein Array mit eindeutigen Objektwerten zu erhalten.

const
    listOfTags = [{ id: 1, label: "Hello", color: "red", sorting: 0 }, { id: 2, label: "World", color: "green", sorting: 1 }, { id: 3, label: "Hello", color: "blue", sorting: 4 }, { id: 4, label: "Sunshine", color: "yellow", sorting: 5 }, { id: 5, label: "Hello", color: "red", sorting: 6 }],
    keys = ['label', 'color'],
    filtered = listOfTags.filter(
        (s => o =>
            (k => !s.has(k) && s.add(k))
            (keys.map(k => o[k]).join('|'))
        )(new Set)
    )
    result = filtered.map(o => Object.fromEntries(keys.map(k => [k, o[k]])));

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

0voto

UI_Brain Punkte 95
let mobilePhones = [{id: 1, brand: "B1"}, {id: 2, brand: "B2"}, {id: 3, brand: "B1"}, {id: 4, brand: "B1"}, {id: 5, brand: "B2"}, {id: 6, brand: "B3"}]
 let allBrandsArr = mobilePhones .map(row=>{
        return  row.brand;
      });
let uniqueBrands =   allBrandsArr.filter((item, index, arry) => (arry.indexOf(item) === index));
console.log('uniqueBrands   ', uniqueBrands );

0voto

robert king Punkte 15261

Verwendung eines Sets und Filters. Dadurch bleibt die Reihenfolge erhalten:

let unique = (items) => {
    const s = new Set();
    return items.filter((item) => {
      if (s.has(item)) {
        return false;
      }
      s.add(item);
      return true;
    });
  }

  console.log(
  unique(
      [
        'one', 'two', 'two', 'three', 'three', 'three'
      ]
    )
  );

/*
output:
[
  "one",
  "two",
  "three"
]
*/

0voto

vitaly-t Punkte 22010

Effizienter und sauberer Ansatz, mit iter-ops Bibliothek:

import {pipe, distinct, map} from 'iter-ops';

const array = 
    [
        {name: 'Joe', age: 17}, 
        {name: 'Bob', age: 17}, 
        {name: 'Carl', age: 35}
    ];

const i = pipe(
    array,
    distinct(a => a.age),
    map(m => m.age)
);

const uniqueAges = [...i]; //=> [17, 35]

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