我有这个结构:
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等?
答案 0 :(得分:5)
您可以将Object.keys
与Array.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];
});