Necesito crear un valor de vela de un objeto con ordenado keys:

 var obj = [{1: 'a'}, {2:'b'}, {3:'c'}, {4:'d'}, {5:'e'},{6: 'a'}, {7:'b'},{8:'c'}, {9:'d'}, {10:'e'}]

¿Cuál es la forma más eficiente de filtrar este objeto según la clave?

Por ejemplo, quiero: el obj filtrado con 2 < keys <5 o 6 < keys < 9

(en realidad, las claves son marcas de tiempo y los valores son datos de precios)

EDITAR: Aquí está el objeto. Eso es lo que quise decir por ordenado

 var obj = [{1: 'a'}, {2:'b'}, {3:'c'}, {4:'d'}, {5:'e'},{6: 'a'}, {7:'b'},{8:'c'}, {9:'d'}, {10:'e'}]
2
TSR 10 sep. 2018 a las 16:52

6 respuestas

La mejor respuesta

Puede usar Object.keys para obtener las claves y reducir para crear un nuevo objeto con par kv que cumpla la condición

var obj = {1: 'a', 2:'b', 3:'c', 4:'d', 5:'e',6: 'a', 7:'b',8:'c', 9:'d', 10:'e'}
var res = Object.keys(obj).reduce((acc, elem) => {
	if (elem > 2 && elem < 5) acc[elem] = obj[elem]
	return acc
}, {})
console.log(res)

Parece que el obj ha cambiado
puede filtrar el nuevo obj un simple .filter ()

var res = obj.filter(elem => Object.keys(elem)[0] > 2 && Object.keys(elem)[0] < 5)

Si decidiste usar la estructura en el comentario

var obj = [{time: 1, value: 'a'},{time: 2, value: 'b'},{time: 3, value: 'c'},{time: 4, value: 'd'}]
var res = obj.filter(elem => elem.time > 2 && elem.time < 5)
4
Chris Li 10 sep. 2018 a las 14:30

¿Me gusta esto?

keys() le dará una matriz de claves de objeto, que puede filtrar

var obj = {1: 'a', 2:'b', 3:'c', 4:'d', 5:'e',6: 'a', 7:'b',8:'c', 9:'d', 10:'e'};
keys(obj).filter((a)=> parseInt(a) > 2 && parseInt(a) <5 );
-1
Eriks Klotins 10 sep. 2018 a las 13:59

Como veo, tienes una matriz, no un objeto. Usando filter y Object.keys y una condición como ((2<key && key<5) || (6<key && key< 9))

var arr = [{1: 'a'}, {2:'b'}, {3:'c'}, {4:'d'}, {5:'e'},{6: 'a'}, {7:'b'},{8:'c'}, {9:'d'}, {10:'e'}]

var newArr = arr.filter((o=>{
    let k = Object.keys(o);
    if((2<k[0] && k[0]<5) || (6<k[0] && k[0]< 9)){
        return true;
    }
}))

console.log(newArr)
0
Emeeus 10 sep. 2018 a las 14:34

Lo que necesita es ordenar primero las claves y luego crear un nuevo objeto con el filtro y los valores ordenados

Lo cambié a Mapa ya que no se garantiza que las claves de objeto estén ordenadas

const obj =  {1: 'a', 2:'b', 4:'c', 3:'d', 5:'e',6: 'a', 7:'b',8:'c', 9:'d', 10:'e'};

const newObj = new Map();
Object.keys(obj).filter(key =>{

    return (key > 2 && key < 5)
    }).sort().forEach(key=>{
      newObj.set(key,obj[key])


    })
0
Amit Wagner 10 sep. 2018 a las 14:24

Objet.keys y < a href = "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce" rel = "nofollow noreferrer"> reduce para crear el nuevo objeto con El conjunto limitado de llaves.

var obj = {1: 'a', 2:'b', 3:'c', 4:'d', 5:'e',6: 'a', 7:'b',8:'c', 9:'d', 10:'e'}

var filtered = Object.keys(obj).reduce((o, k) => {
  const num = Number(k)
  if (num > 4 && num < 9) {
   o[k] = obj[k]
  }
  return o
}, {})

console.log(filtered)

Y solo una advertencia de que las claves del objeto pueden no estar en el orden de los números. Entonces, cuando los está generando, es no garantizado que 5 serán antes 6)

0
epascarello 10 sep. 2018 a las 14:05

Si está usando lodash, es tan simple como sigue:

const _ = require('lodash');
var obj = {1: 'a', 2:'b', 3:'c', 4:'d', 5:'e',6: 'a', 7:'b',8:'c', 9:'d', 10:'e'};
filtered = _.pickBy(obj,(val,key) =>{return ((key > 2) && (key < 5))})
0
Chris Aby Antony 10 sep. 2018 a las 14:09