¿Cómo obtener valores distintos de una serie de objetos en JavaScript?

Resuelto Rolando asked hace 11 años • 64 respuestas

Suponiendo que tengo lo siguiente:

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

¿Cuál es la mejor manera de poder obtener una variedad de todas las edades distintas de modo que obtenga una variedad de resultados de:

[17, 35]

¿Hay alguna manera de que pueda estructurar alternativamente los datos o un método mejor de modo que no tenga que iterar a través de cada matriz verificando el valor de "edad" y comparar su existencia con otra matriz, y agregarla si no?

Si hubiera alguna manera de poder extraer las distintas edades sin iterar...

Manera ineficiente actual que me gustaría mejorar... Si eso significa que en lugar de que "matriz" sea una matriz de objetos, sino un "mapa" de objetos con alguna clave única (es decir, "1,2,3"), eso sería está bien también. Solo estoy buscando la forma más eficiente en cuanto a rendimiento.

Lo siguiente es cómo lo hago actualmente, pero para mí, la iteración parece ser mala para la eficiencia a pesar de que funciona...

var distinct = []
for (var i = 0; i < array.length; i++)
   if (array[i].age not in distinct)
      distinct.push(array[i].age)
Rolando avatar Feb 28 '13 08:02 Rolando
Aceptado

Si estás utilizando ES6/ES2015 o posterior, puedes hacerlo de esta manera:

const data = [
  { group: 'A', name: 'SD' }, 
  { group: 'B', name: 'FI' }, 
  { group: 'A', name: 'MM' },
  { group: 'B', name: 'CO'}
];
const unique = [...new Set(data.map(item => item.group))]; // [ 'A', 'B']

Aquí hay un ejemplo de cómo hacerlo.

Vlad Bezden avatar Jan 29 '2016 19:01 Vlad Bezden

Para aquellos que quieran devolver un objeto con todas las propiedades únicas por clave

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

const key = 'age';

const arrayUniqueByKey = [...new Map(array.map(item =>
  [item[key], item])).values()];

console.log(arrayUniqueByKey);

   /*OUTPUT
       [
        { "name": "Bob", "age": 17 },
        { "name": "Carl", "age": 35 }
       ]
   */

 // Note: this will pick the last duplicated item in the list.
Expandir fragmento

Arun Saini avatar Oct 17 '2019 09:10 Arun Saini