请原谅我,我不确定我是否正确解决了这个问题。
我有一些具有类型和ID的数据(成千上万个元素):
const data = [
{ type: 'foo', id: 1 },
{ type: 'foo', id: 3 },
{ type: 'foo', id: 5 },
{ type: 'baz', id: 8 },
{ type: 'baz', id: 10 },
{ type: 'bar', id: 11 },
{ type: 'bar', id: 13 },
{ type: 'bar', id: 17 },
...
];
对于crossfilter,我想按类型过滤并返回其所有id的数组。
例如:所有“ bar”类型都应返回[10, 11, 13, 17]
我试图将reduce分组。但是我并没有走得很远:
let ndx = crossfilter(data);
let d = ndx.dimension(d => d.type);
let reduceAdd = (p, v) => p.push(v);
let reduceRemove = (p, v) => p.filter(i => i !== v);
let reduceInitial = () => ([]);
然后类似:
d.group().reduce(reduceAdd, reduceRemove, reduceInitial)
答案 0 :(得分:4)
您应结合使用filter
方法和map
和destructing assignment。
const data = [ { type: 'foo', id: 1 }, { type: 'foo', id: 3 }, { type: 'foo', id: 5 }, { type: 'baz', id: 8 }, { type: 'baz', id: 10 }, { type: 'bar', id: 11 }, { type: 'bar', id: 13 }, { type: 'bar', id: 17 }, ], type = 'bar';
console.log(data.filter(elem => elem.type == type).map(({id}) => id));
答案 1 :(得分:2)
您所拥有的东西对我来说几乎是正确的。您只需要通过将组保存到变量来查询您的组
var grp = d.group().reduce(reduceAdd, reduceRemove, reduceInitial)
然后像查询
grp.top(Infinity)
这将返回一个对象数组。对象之一的键为bar
,该对象的值将为记录数组,其中type
为bar
。
答案 2 :(得分:0)
在这种情况下,使用单个forEach()
比使用filter()
然后使用map()
更为有效,因为复杂度为O(n)
,其中n
是对象的数量,但先使用filter()
然后使用map()
,则复杂度为O(n+m)
,其中m
是您在map()
上进行过滤的记录数:< / p>
const data = [
{ type: 'foo', id: 1 },
{ type: 'foo', id: 3 },
{ type: 'foo', id: 5 },
{ type: 'baz', id: 8 },
{ type: 'baz', id: 10 },
{ type: 'bar', id: 11 },
{ type: 'bar', id: 13 },
{ type: 'bar', id: 17 },
];
let type = 'bar';
var res = [];
data.forEach((obj)=> {
if(obj.type===type){
res.push(obj.id);
}
});
console.log(res);
如果有8
个对象,那么您要在过滤器中迭代8
次,然后假设您在过滤器中获得了4
条记录,然后您将迭代4
次以获得结果数组中的id
值。总共12
个迭代。因此,在这种情况下,我更喜欢支持forEach()
的用法,在该用法中,只有8
个迭代才能获得相同的数组集。
答案 3 :(得分:0)
const data = [
{ type: 'foo', id: 1 },
{ type: 'foo', id: 3 },
{ type: 'foo', id: 5 },
{ type: 'baz', id: 8 },
{ type: 'baz', id: 10 },
{ type: 'bar', id: 11 },
{ type: 'bar', id: 13 },
{ type: 'bar', id: 17 },
];
let type = 'bar';
let result = data.reduce((acc, {type, id})=>{
if(!acc[type]) acc[type]=[];
acc[type].push(id);
return acc
},{})
console.log(result[type]);
答案 4 :(得分:0)
您也可以在此处使用Array.reduce
。
const data = [
{ type: 'foo', id: 1 },
{ type: 'foo', id: 3 },
{ type: 'foo', id: 5 },
{ type: 'baz', id: 8 },
{ type: 'baz', id: 10 },
{ type: 'bar', id: 11 },
{ type: 'bar', id: 13 },
{ type: 'bar', id: 17 }
];
const filteredArray = data.reduce((result, obj) => {
if (obj.type === "bar") {
result.push(obj.id)
}
return result;
}, []);
console.log(filteredArray)