我正在尝试获取超过特定次数的项目列表。以下代码从对象数组中提取id。然后筛选出两次或多次出现的项目。
item[1]
是出现次数,item[0]
是学生ID。
var list = _.chain(allpeople)
.countBy(function(regentry) {
return regentry.get("Student").id;
})
.pairs()
.filter(function(item){
if(item[1]>=2)
return item[0];
})
.value();
我有两个问题:
list
是一个二维数组(id和出现次数 - 见下文),而不仅仅是一个id列表。我如何只将其列为ID列表?
0: "aaYiWFxdtV"
1: 2
这似乎不是很有效(当我有数百个项目时,我认为这可能不是最好的方法)。我可以用更少的步骤做到这一点吗?
答案 0 :(得分:0)
filter函数只过滤数组,但不会更改项目。因此,您应该在谓词函数中返回true | false。
过滤后,您可以使用map更改结果项目。
var list = _.chain(allpeople)
.countBy(function (regentry) {
return regentry.get('Student').id;
})
.pairs()
.filter(function (item) {
return item[1] >= 2;
})
.map(function (item) {
return item[0];
})
.value();
关于你的第二个问题:我不知道有任何其他方法可以做到这一点。但我也不熟悉underscore.js。也许其他人可以在这里回答。
答案 1 :(得分:0)
可以简化代码并使其返回您想要的内容:
var result = _.chain(allpeople)
.countBy(function(regentry) {
return regentry.get('Student').id;
})
.pick(function(count){
return count >= 2;
})
.keys()
.value();
countBy函数将返回一个对象,其中键是id,它们的值将是它们的计数。然后可以使用Pick来选择传递谓词的键(计数大于或等于2的位置)。
var allpeople = [
{ id: 1 },
{ id: 2 },
{ id: 3 },
{ id: 2 },
{ id: 3 }
];
var result = _.chain(allpeople)
.countBy(function(regentry) {
return regentry.id;
})
.pick(function(count){
return count >= 2;
})
.keys()
.value();
document.getElementById('results').textContent = JSON.stringify(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore.js"></script>
<pre id="results"></pre>
&#13;