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

Mirza Hayat Punkte 256

Jetzt können wir das Objekt auf der Basis derselben Schlüssel und derselben Werte einzigartig machen

 const arr = [{"name":"Joe", "age":17},{"name":"Bob", "age":17}, {"name":"Carl", "age": 35},{"name":"Joe", "age":17}]
    let unique = []
     for (let char of arr) {
     let check = unique.find(e=> JSON.stringify(e) == JSON.stringify(char))
     if(!check) {
     unique.push(char)
     }
     }
    console.log(unique)

////outPut::: [{ Name: "Joe", Alter: 17 }, { Name: "Bob", Alter: 17 },{ Name: "Carl", Alter: 35 }]

0voto

Devonte Punkte 3029
unique(obj, prop) {
    let result = [];
    let seen = new Set();

    Object.keys(obj)
        .forEach((key) => {
            let value = obj[key];

            let test = !prop
                ? value
                : value[prop];

            !seen.has(test)
                && seen.add(test)
                && result.push(value);
        });

    return result;
}

-1voto

Rafael Herscovici Punkte 15633

Meine Meinung zu dieser Funktion:

var result = [];
for (var len = array.length, i = 0; i < len; ++i) {
  var age = array[i].age;
  if (result.indexOf(age) > -1) continue;
  result.push(age);
}

Das Ergebnis können Sie hier sehen (Methode 8) http://jsperf.com/distinct-values-from-array/3

-1voto

Ahmet Emrebas Punkte 167

Saubere Lösung

export abstract class Serializable<T> {
  equalTo(t: Serializable<T>): boolean {
    return this.hashCode() === t.hashCode();
  }
  hashCode(): string {
    throw new Error('Not Implemented');
  }
}

export interface UserFields {
  firstName: string;
  lastName: string;
}

export class User extends Serializable<User> {
  constructor(private readonly fields: UserFields) {
    super();
  }
  override hashCode(): string {
    return `${this.fields.firstName},${this.fields.lastName}`;
  }
}

const list: User[] = [
  new User({ firstName: 'first', lastName: 'user' }),
  new User({ firstName: 'first', lastName: 'user' }),
  new User({ firstName: 'second', lastName: 'user' }),
  new User({ firstName: 'second', lastName: 'user' }),
  new User({ firstName: 'third', lastName: 'user' }),
  new User({ firstName: 'third', lastName: 'user' }),
];

/**
 * Let's create an map
 */
const userHashMap = new Map<string, User>();

/**
 * We are adding each user into the map using user's hashCode value
 */
list.forEach((user) => userHashMap.set(user.hashCode(), user));

/**
 * Then getting the list of users from the map,
 */
const uniqueUsers = [...userHashMap.values()];

/**
 * Let's print and see we did right?
 */
console.log(uniqueUsers.map((e) => e.hashCode()));

-1voto

felixy Punkte 179

Wenn Sie doppelte Werte aus einem Array über eine bekannte eindeutige Objekteigenschaft herausfiltern möchten, können Sie das folgende Snippet verwenden:

let arr = [
  { "name": "Joe", "age": 17 },
  { "name": "Bob", "age": 17 },
  { "name": "Carl", "age": 35 },
  { "name": "Carl", "age": 35 }
];

let uniqueValues = [...arr.reduce((map, val) => {
    if (!map.has(val.name)) {
        map.set(val.name, val);
    }
    return map;
}, new Map()).values()]

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