下划线js - 超过特定次数的项目列表

时间:2015-12-29 18:12:05

标签: javascript parse-platform underscore.js

我正在尝试获取超过特定次数的项目列表。以下代码从对象数组中提取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();

我有两个问题:

  1. list是一个二维数组(id和出现次数 - 见下文),而不仅仅是一个id列表。我如何只将其列为ID列表?

    0: "aaYiWFxdtV" 1: 2

  2. 这似乎不是很有效(当我有数百个项目时,我认为这可能不是最好的方法)。我可以用更少的步骤做到这一点吗?

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;
&#13;
&#13;