如何使用Underscore从这种集合中获取最大和最小键?似乎是一项简单的任务,但我找不到快速解决方案。
{
"2013-06-26":839,
"2013-06-25":50,
"2013-06-22":25,
"2013-05-14":546,
"2013-03-11":20
}
答案 0 :(得分:6)
不幸的是,_. min和_.max只支持数字,所以我们不能将它们用于你的字符串键。幸运的是,您的日期采用字符串排序格式。
var minkey, maxkey;
_.each(obj, function(value, key) {
if (minkey == null || key < minkey) { minkey = key; }
});
_.each(obj, function(value, key) {
if (maxkey == null || key > maxkey) { maxkey = key; }
});
现在,如果你真的想要最大/最小值的键,那就是这个。幸运的是,你的价值观是数字,所以这更容易:
var keys = _.keys(obj);
function itemgetter(key) { return obj[key]; }
minkey = _.min(keys, itemgetter);
maxkey = _.max(keys, itemgetter);
答案 1 :(得分:2)
虽然这个问题不是很老问题,但是有相同的单行解决方案,你可以链接它。
var a ={
"2013-06-26":839,
"2013-06-25":50,
"2013-03-08":25,
"2013-05-14":546,
"2013-03-11":20
};
_.chain(a).keys().sort().last().value(); //max: 2013-06-26
_.chain(a).keys().sort().first().value(); //min: 2013-03-08
答案 2 :(得分:0)
要获取对象的最大和最小键值,如果这是真正的意思而不是最大值和最小值的关键(可能值得在您的问题中澄清),那么对于您给出的示例,您可以在POJS中这样做。
的Javascript
function getMaxKey(object) {
var max,
i;
for (i in object) {
if (object.hasOwnProperty(i)) {
if (!max) {
max = i;
} else if (i > max) {
max = i;
}
}
}
return max;
}
function getMinKey(object) {
var min,
i;
for (i in object) {
if (object.hasOwnProperty(i)) {
if (!min) {
min = i;
} else if (i < min) {
min = i;
}
}
}
return min;
}
var test = {
"2013-06-26": 839,
"2013-06-25": 50,
"2013-06-22": 25,
"2013-05-14": 546,
"2013-03-11": 20
};
console.log(getMaxKey(test));
console.log(getMinKey(test));
输出
2013-06-26
2013-03-11
上
或使用@dandavis
建议的ECMA5Object.keys
的Javascript
function getMaxKey(object) {
return Object.keys(object).sort()[0];
}
function getMinKey(object) {
return Object.keys(object).sort().slice(-1)[0]
}
var test = {
"2013-06-26": 839,
"2013-06-25": 50,
"2013-06-22": 25,
"2013-05-14": 546,
"2013-03-11": 20
};
console.log(getMaxKey(test));
console.log(getMinKey(test));
上
另一方面,如果您想获得最大值最小值的关键值,那么您可以在POJS中执行此操作。
的Javascript
function getMaxKey(object) {
var max,
key,
i;
for (i in object) {
if (object.hasOwnProperty(i)) {
if (typeof max !== "number") {
max = object[i];
key = i;
} else if (i > max) {
max = object[i];
key = i;
}
}
}
return key;
}
function getMinKey(object) {
var min,
key,
i;
for (i in object) {
if (object.hasOwnProperty(i)) {
if (typeof min !== "number") {
min = object[i];
key = i;
} else if (object[i] < min) {
min = object[i];
key = i;
}
}
}
return key;
}
var test = {
"2013-06-26": 839,
"2013-06-25": 50,
"2013-06-22": 25,
"2013-05-14": 546,
"2013-03-11": 20
};
console.log(getMaxKey(test));
console.log(getMinKey(test));
上
在这种情况下(使用您的特定测试数据),输出将与前一个示例相同。
或使用ECMA5 Object.keys
和Array.prototype.reduce
的Javascript
function getMaxKey(object) {
return Object.keys(object).reduce(function (previous, key) {
return object[key] > object[previous] ? key : previous;
});
}
function getMinKey(object) {
return Object.keys(object).reduce(function (previous, key) {
return object[key] < object[previous] ? key : previous;
});
}
var test = {
"2013-06-26": 839,
"2013-06-25": 50,
"2013-06-22": 25,
"2013-05-14": 546,
"2013-03-11": 20
};
console.log(getMaxKey(test));
console.log(getMinKey(test));
上
第二个示例很容易通过将Underscore与部分或全部这些方法_.keys
,_.min
和_.max
一起使用来完成,并且已经得到了回答。