使用Crossfilter,如何返回特定类型的所有id值的数组

时间:2018-12-04 10:29:08

标签: javascript crossfilter

请原谅我,我不确定我是否正确解决了这个问题。

我有一些具有类型和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)

5 个答案:

答案 0 :(得分:4)

您应结合使用filter方法和mapdestructing 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,该对象的值将为记录数组,其中typebar

答案 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)