使用Underscore从集合中获取最大和最小关键帧
Get max and min keys from a collection with Underscore
如何使用Underscore从这种集合中获取最大和最小密钥?这似乎是一项容易的任务,但我没有找到一个快速的解决方案。
{
"2013-06-26":839,
"2013-06-25":50,
"2013-06-22":25,
"2013-05-14":546,
"2013-03-11":20
}
不幸的是,_.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);
虽然这是一个小问题,但有一个单行解决方案,您可以将其链接起来。
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
jsFiddle
要获得对象的最大和最小键值,如果这确实是你的意思,而不是最大和最小值的键(也许值得在你的问题中澄清),那么对于你给出的例子,你可以在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
关于jsfiddle
或使用@dandavis 建议的ECMA5 Object.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));
关于jsfiddle
另一方面,如果你想获得最大值和最小值的键,那么你可以在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));
关于jsfiddle
在这种情况下(使用特定的测试数据),输出将与前面的示例相同。
或使用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));
关于jsfiddle
通过将Undercore与这些方法_.keys
、_.min
和_.max
中的一些或全部一起使用,可以容易地完成第二个示例,并且已经回答了该示例。
相关文章:
- 关键帧之间的css3动画延迟
- 访问css3动画的关键帧
- 当用户滚动到页面的某个部分时,如何触发关键帧
- 动态关键帧插入在 IE 或 Firefox 上不起作用
- CSS3卡翻转带关键帧不工作
- 一种读取或更改CSS动画关键帧的方法
- Skrollr:当滚动位置在最后一个关键帧之后时传递函数
- 替换对象数组中的关键帧
- 如何在Javascript中更改关键帧状态
- CSS - 在关键帧中触发悬停
- 多次单击时运行关键帧动画
- CSS3 关键帧动画是否比属性过渡更平滑?
- 使用关键帧图像旋转器时,图像不会在两个块之间同步协调
- CSS关键帧过渡的最佳方法
- CSS 关键帧动画的随机“起点”
- 为什么单击时的关键帧动画只触发一次
- 从另一个帧获取帧的内部宽度
- 如何从 css 动画关键帧获取图像以在完成后保留在页面上
- 获取/设置当前@关键帧百分比/更改关键帧
- 使用Underscore从集合中获取最大和最小关键帧