我目前对 JS 和下划线还很陌生。我想查看给定数组中哪个特定数字出现次数最多(现在说 var a )。作为一个狂热的 python 用户,我习惯于在频率电报中对其求和,然后将其输出为元组 [(1, 3), (2, 2), ... ],然后这样排序。
在 javascript 中这样做的最佳方法是什么?
function votesTied() {
var a = [1, 2, 3, 1, 2, 4, 6, 1, 7];
var tele = {};
_.each(a, function(key) {
if (tele[key]) {
tele[key]++;
} else {
tele[key] = 1;
}
});
var items = _.map(tele, function(frequency,key) { return [key,frequency]; });
var results = _.sortBy(items, function(tuple) { return -1 * tuple[1]; }).value();
return results.length > 1 && results[0][1] == results[1][1];
}
我这么问是因为我可以在 1 行 python 中完成所有这些。我相信有一种更优雅的方式可以用下划线或 javascript 来编写它。
最佳答案
不幸的是,underscore 的 map()
函数无法返回具有已维护属性的对象,因为这会允许类似这样的事情:
var t = _.chain (a)
.groupBy (function (p) { return p; })
.map (function (e) { return _.size (e); })
.value ();
但如果不重写函数以允许这样做,我能想到的最好的办法是:
var t = {};
_.chain (a)
.groupBy (function (p) { return p; })
.each (function (e, i) {
t[i] = _.size (e);
});
这将收集 t
中的所有内容。
更新
我不能让它这样,所以我检查了 underscore 的 map()
的源代码,并进行了以下更改以允许上面的第一个代码段:
_.map = function(obj, iterator, context) {
// determine the return type
if (_.isArray (obj)) {
var results = [];
}
else {
var results = {};
}
if (obj == null) return results;
// @xxx: we need to override the native map(), thus the next line is commented out
// if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results[index] = iterator.call(context, value, index, list);
});
if (obj.length === +obj.length) results.length = obj.length;
return results;
};
虽然我还没有彻底检查它,但它应该可以工作。
关于javascript - 下划线 Javascript 构建频率图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740493/