¿Cómo puedo obtener la posición de un objeto json?

publicado por: Anonymous

Mi programa carga un archivo json, lo lee y lo escribe, pero además, tiene una función, los ordena por la cantidad de puntos. El anterior paso que he hecho en mi programa está aquí.

Los datos a procesar provienen de:

let points = JSON.parse(fs.readFileSync('./points.json', 'utf8'));

El formato del archivo ./points.json es el siguiente:

{
  "242043489611808769":{"points":617,"level":4,"time":1482316617392},
  "129213229221019648":{"points":22,"level":0,"time":1482316617609},
  "190388892799598592":{"points":214,"level":2,"time":1482316612355}
}

Y por último, los datos son ordenados conforme la cantidad de puntos, a través del siguiente bloque de código:

var points_array = Object.keys(points).map(
  function (clave) {
    var elemento = points[clave];
    elemento.id = clave;
    return elemento;
  }
);
points_array.sort(
  function(a, b) {
    return b.points - a.points;
  }
);

Con la cual, points_array[0].id devolvería la id del usuario con mayor valor de points. Sin embargo, necesito saber cómo puedo obtener la posición del usuario ordenada en función del campo points a partir del campo id, es decir, quiero, por ejemplo, buscar la posición que tiene el usuario 190388892799598592, la cual debería devolver 1 (617 > 214 > 22).

He probado con varios códigos pero no he conseguido hacer que devuelva otra cosa que -1 (not found). Uno de ellos es el siguiente:

points_array.find(
  function(a) {
    return a.id == msg.author.id;
  }
);

Pero devuelve -1

Gracias por adelantado.

solución

Puedes hacerlo de muchas formas. Si la búsqueda es esporádica (una única vez) es mejor implementar una función que recorra la matriz hasta encontrar tu identificador. Si vas a hacer muchas búsquedas (vas a mostrar la posición de varios identificadores) entonces lo mejor es almacenar las posiciones en una matriz asociativa:

_x000D_

_x000D_

/* Los datos que has proporcionado en el ejemplo */_x000D_
var json = '{_x000D_
  "242043489611808769": {_x000D_
    "points": 617,_x000D_
    "level":4,_x000D_
    "time":1482316617392_x000D_
  },_x000D_
  "129213229221019648": {_x000D_
    "points": 22,_x000D_
    "level":0,_x000D_
    "time":1482316617609_x000D_
  },_x000D_
  "190388892799598592": {_x000D_
    "points":214,_x000D_
    "level":2,_x000D_
    "time":1482316612355_x000D_
  }_x000D_
}';_x000D_
/* Tratamos los datos */_x000D_
var points = JSON.parse(json);_x000D_
/* Los convertimos en un array añadiendo el "id" a los campos */_x000D_
var points_array = Object.keys(points).map(_x000D_
  function (clave) {_x000D_
    var elemento = points[clave];_x000D_
    elemento.id = clave;_x000D_
    return elemento;_x000D_
  }_x000D_
);_x000D_
/* Los ordenamos comparando los puntos (points) */_x000D_
points_array.sort(_x000D_
  function(a, b) {_x000D_
    return b.points - a.points;_x000D_
  }_x000D_
);_x000D_
/* Obtenemos el primer elemento (el mayor) */_x000D_
console.log(points_array[0]);_x000D_
console.log(points_array[0].id);_x000D_
_x000D_
/* Creamos una función que haga el trabajo */_x000D_
function encontrar_id(array, elemento) {_x000D_
  for (i = 0; i < array.length; i++) {_x000D_
    if (array[i].id == elemento) {_x000D_
      return i + 1;_x000D_
    }_x000D_
  }_x000D_
  return undefined;_x000D_
}_x000D_
_x000D_
/* Hacemos uso de la función */_x000D_
console.log("Posición de '129213229221019648': " +_x000D_
  encontrar_id(points_array, "129213229221019648")_x000D_
);_x000D_
console.log("Posición de '242043489611808769': " +_x000D_
  encontrar_id(points_array, "242043489611808769")_x000D_
);_x000D_
console.log("Posición de '190388892799598592': " +_x000D_
  encontrar_id(points_array, "190388892799598592")_x000D_
);_x000D_
console.log("Posición de '290388892799598592': " +_x000D_
  encontrar_id(points_array, "290388892799598592")_x000D_
);_x000D_
_x000D_
/* Creamos una matriz asociativa id -> posicion */_x000D_
posiciones = {};_x000D_
for (i = 0; i < points_array.length;) {_x000D_
  posiciones[points_array[i].id] = ++i;_x000D_
}_x000D_
console.log(posiciones);_x000D_
_x000D_
/* Hacemos uso de este método */_x000D_
console.log("Posición de '129213229221019648': " +_x000D_
  posiciones["129213229221019648"]_x000D_
);_x000D_
console.log("Posición de '242043489611808769': " +_x000D_
  posiciones["242043489611808769"]_x000D_
);_x000D_
console.log("Posición de '190388892799598592': " +_x000D_
  posiciones["190388892799598592"]_x000D_
);_x000D_
console.log("Posición de '290388892799598592': " +_x000D_
  posiciones["290388892799598592"]_x000D_
);

_x000D_

_x000D_

_x000D_

En caso de no encontrar el identificador, tanto la función como la matriz devolverán undefined.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *