Эффективный способ фильтрации объекта по значению ключа - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно создать значение свечи для объекта с отсортированным keys:

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

Какой самый эффективный способ фильтрации этого объекта по ключу?

Например, я хочу: объект, отфильтрованный с помощью 2 < keys <5 или 6 < keys < 9

(в действительности ключи - это отметка времени, а значения - данные о цене)

EDIT: Здесь объект. Вот что я имел в виду, отсортировав

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

Ответы [ 6 ]

0 голосов
/ 10 сентября 2018

Как я вижу, у вас есть массив, а не объект. Использование filter и Object.keys и условие типа ((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 голосов
/ 10 сентября 2018

вам нужно сначала отсортировать ключи, а затем создать новый объект с фильтром и отсортированными значениями

я изменил его на Map, поскольку ключи объекта не гарантированно будут отсортированы

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 голосов
/ 10 сентября 2018

Если вы используете lodash, это так просто:

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 голосов
/ 10 сентября 2018

Простые Objet.keys и уменьшают , чтобы создать новый Объект с ограниченным набором ключей.

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)

И просто предупреждение о том, что ключи объектов могут быть не в порядке чисел. Поэтому, когда вы выводите их, не гарантирует , что 5 будет раньше 6.

0 голосов
/ 10 сентября 2018

Вы можете использовать Object.keys, чтобы получить ключи и уменьшить, чтобы создать новый объект с парой kv, который удовлетворяет условию

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)

похоже, что объект был изменен
Вы можете отфильтровать новый объект простым .filter ()

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

если вы решили использовать структуру в комментарии

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)
0 голосов
/ 10 сентября 2018

как это?

keys() даст вам массив ключей объектов, которые вы можете фильтровать

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...