过滤地图并返回ID数组

时间:2019-01-30 15:53:40

标签: javascript lodash

我有这个结构:

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

我需要类似的东西:

var ids = entities.filter( p => p.age > 30);

应返回一个数组:

[1, 2]

有一种方便的方法吗?例如Lodash等?

6 个答案:

答案 0 :(得分:5)

您可以将Object.keysArray.prototype.filter组合使用

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}
const result = Object.keys(entities).filter(key =>  entities[key].age > 30);
console.log(result);

答案 1 :(得分:2)

filter仅适用于Array,但有一点很有趣:您的对象看起来像一个数组!

使用javascript的人会说:

  

如果它走路像鸭子,却像鸭子一样嘎嘎叫,那它就是鸭子

在这种情况下,像数组一样的东西只是一个具有数字作为键 plus length属性的对象。看着对象,您只是错过了length属性!

让我们以这种方式添加length属性:

entities.length = Math.max(...Object.keys(entities)) + 1; // 4

然后,您可以在真实的数组中变换类似数组的对象:

const array = Array.from(entities);

最后,您可以在其上使用所有Array方法,还可以进行过滤:

array
  .filter(p => p.age > 30)
  .map((obj, index) => index);

答案 2 :(得分:2)

您可以使用lodash reduce方法。它适用于数组和对象。 示例:

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

var result = _.reduce(entities, (acc, o, key) => {
    if(o.age >= 35) { // add your condition here
       acc.push(key);
     }
    return acc;
}, []);

console.log(result); // ["1", "2"]

答案 3 :(得分:1)

您可以获取条目,过滤年龄并返回键(显然是字符串)。

var entities = { 1: {'name': 'Fred', 'age': 35 }, 2: {'name': 'Hans', 'age': 47 }, 3: {'name': 'Bert', 'age': 27 } },
    result = Object
        .entries(entities)
        .filter(({ 1: { age } }) => age > 30)
        .map(([k]) => k);

console.log(result);

答案 4 :(得分:1)

您可以循环浏览entities键,并检查entities中特定键的年龄条件,然后进行过滤。

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

let op = Object.keys(entities).filter(e=> entities[e].age > 30)

console.log(op)

答案 5 :(得分:0)

使用_.map()和_.keys()来实现类似于下面的代码

var i= -1;
var keys=_.keys(entities);
var person= _.map(entities, function(p) {
    i++;
    if (p.age>30) return keys[i];
});