按键值过滤对象的有效方法

时间:2018-09-10 13:52:03

标签: javascript arrays object

我需要创建具有排序 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 <56 < keys < 9过滤的obj

(实际上,键是时间戳,值是价格数据)

编辑: 这是对象。这就是我所说的排序

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

6 个答案:

答案 0 :(得分:3)

您可以使用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)

看起来obj已更改
您可以通过简单的.filter()

过滤新的obj
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)

答案 1 :(得分:0)

简单的Objet.keysreduce用一组有限的键创建新的对象。

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)

仅警告对象键可能不按数字顺序。因此,当您输出它们时,not guaranteed中的5将在6之前。

答案 2 :(得分:0)

如果您正在使用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))})

答案 3 :(得分:0)

您需要的是先对键进行排序,然后使用过滤器和排序后的值创建新对象

我将其更改为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])


    })

答案 4 :(得分:0)

如我所见,您有一个数组而不是对象。使用filterObject.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)

答案 5 :(得分:-1)

像这样吗?

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 );