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)

1voto

Emanuel Punkte 1456

@Travis J Wörterbuch-Antwort in einem Typescript-Typsicherheits-Funktionsansatz

const uniqueBy = <T, K extends keyof any>(
  list: T[] = [],
  getKey: (item: T) => K,
) => {
  return list.reduce((previous, currentItem) => {
    const keyValue = getKey(currentItem)
    const { uniqueMap, result } = previous
    const alreadyHas = uniqueMap[keyValue]
    if (alreadyHas) return previous
    return {
      result: [...result, currentItem],
      uniqueMap: { ...uniqueMap, [keyValue]: true }
    }
  }, { uniqueMap: {} as Record<K, any>, result: [] as T[] }).result
}

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

console.log(uniqueBy(array, el => el.age))

// [
//     {
//         "name": "Joe",
//         "age": 17
//     },
//     {
//         "name": "Carl",
//         "age": 35
//     }
// ]

1voto

Krishnadas PC Punkte 4850

Zurzeit arbeite ich an einer Typescript-Bibliothek zur Abfrage von js-Objekten in einer Orm-Art. Sie können von dem unten stehenden Link herunterladen. Diese Antwort erklärt, wie man mit der unten genannten Bibliothek zu lösen.

https://www.npmjs.com/package/@krishnadaspc/jsonquery?activeTab=readme

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

const ageArrayObj = new JSONQuery(ageArray)
console.log(ageArrayObj.distinct("age").get()) // outputs: [ { name: 'Bob', age: 17 }, { name: 'Carl', age: 35 } ]

console.log(ageArrayObj.distinct("age").fetchOnly("age")) // outputs: [ 17, 35 ]

Runkit live link: https://runkit.com/pckrishnadas88/639b5b3f8ef36f0008b17512

1voto

Polv Punkte 1606

Ich habe meine eigene in TypeScript geschrieben, für einen generischen Fall, wie der in Kotlins Array.distinctBy {} ...

function distinctBy<T, U extends string | number>(array: T[], mapFn: (el: T) => U) {
  const uniqueKeys = new Set(array.map(mapFn));
  return array.filter((el) => uniqueKeys.has(mapFn(el)));
}

Wo U ist natürlich hashfähig. Für Objects benötigen Sie möglicherweise https://www.npmjs.com/package/es6-json-stable-stringify

1voto

Die Beantwortung dieser alten Frage ist ziemlich sinnlos, aber es gibt eine einfache Antwort, die mit der Natur von Javascript zu tun hat. Objekte in Javascript sind von Natur aus Hash-Tabellen. Wir können dies nutzen, um einen Hash von eindeutigen Schlüsseln zu erhalten:

var o = {}; array.map(function(v){ o[v.age] = 1; });

Dann können wir den Hash auf ein Array mit eindeutigen Werten reduzieren:

var a2 = []; for (k in o){ a2.push(k); }

Das ist alles, was Sie brauchen. Das Array a2 enthält nur die eindeutigen Altersangaben.

1voto

Nehmen wir an, wir haben Daten wie die folgenden arr=[{id:1,age:17},{id:2,age:19} ...] dann können wir einzigartige Objekte wie dieses finden -

function getUniqueObjects(ObjectArray) {
    let uniqueIds = new Set();
    const list = [...new Set(ObjectArray.filter(obj => {
        if (!uniqueIds.has(obj.id)) {
            uniqueIds.add(obj.id);
            return obj;
        }
    }))];

    return list;
}

Hier prüfen Codepen Link

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