使用Loadsh从数组中过滤出对象内唯一的值

3
我正在尝试使用loadsh从以下数组中获取唯一的类别。
[{
  "listingId": "p106a904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 1
}, {
  "listingId": "p106904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 2
}, {
  "listingId": "pc8f54389-4e58-482a-9535-6917c2948764",
  "section": "1",
  "category": "WIP",
  "type": "paper",
  "availableTickets": 1
}]

这是我尝试过的内容

 this.categories = _.uniq(this.listings, function (test: ListDAO) { return test.category; });

但是上面的代码返回了同样的数组。如何得到输出结果为“VIP PASS和WIP”呢?
3个回答

3

不使用lodash,使用.reduce:

let arr2 = arr.reduce((a, i) => a.indexOf(i.category) > -1 ? a : a.concat(i.category), []);

https://jsfiddle.net/42my6p08/


如何将此更改为支持TypeScript - user7426734
@faceturn 是有效的 js/typescript 代码(就像我的一样)。 - Naftali
this.listings.reduce((a, i) => a.indexOf(i.category) > -1 ? a : a.concat(i.category), []).filter(c => !!c); 这段代码的作用是将列表中的分类去重并过滤掉空值。 - user7426734
这将返回空字符串。 - user7426734
@faceturn - https://jsfiddle.net/42my6p08/1/ - 空字符串已被过滤。 - tymeJV
显示剩余2条评论

2

你需要使用uniqBy,因为uniq只接受没有回调函数的常规数组。

https://lodash.com/docs/4.17.4#uniqBy

你可以尝试这个:

this.categories = _.uniqBy(this.listings, ({ category }) => category);

如果你只想要字符串(根据评论),你可以这样做:
const getCategory = ({ category }) => category;

this.categories = _.uniqBy(this.listings, getCategory).map(getCategory);

(您可以使用与我的相同的回调函数,而不是我的。)

它不适用于TypeScript,类别上有一个错误。 - user7426734
你仍然可以使用你的同样旧的回调函数 function (test: ListDAO) { return test.category; } @faceturn - Naftali
this.ticketCategories = _.uniqBy(this.listings, function (test: ListDAO) { return test.category; }); 这段代码的意思是:将 this.listings 中的元素按照 category 属性去重,然后赋值给 this.ticketCategories。其中,_.uniqBy 是 Lodash 库中的一个方法,用于数组去重。 - user7426734
以上返回正确的唯一对象,而不是所提到的字符串值。 - user7426734
你可以再次使用相同的回调函数... 我只是利用 ES6 的新特性使它更简洁。 - Naftali
显示剩余10条评论

0
一个使用 Mapreduce 的解决方案。

var arr = [{
  "listingId": "p106a904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 1
}, {
  "listingId": "p106904a-b8c6-4d2d-a364-0d21e3505010",
  "section": "section1",
  "category": "VIP PASS ",
  "type": "paper",
  "availableTickets": 2
}, {
  "listingId": "pc8f54389-4e58-482a-9535-6917c2948764",
  "section": "1",
  "category": "WIP",
  "type": "paper",
  "availableTickets": 1
}];

var unique = arr.reduce((map, o) => (map.has(o.category) ? map : map.set(o.category)),new Map());
console.log(Array.from(unique.keys()));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接