4

如何使用 Underscore 从这种集合中获取最大和最小键?似乎是一件容易的事,但我没有找到快速的解决方案。

{
    "2013-06-26":839,
    "2013-06-25":50,
    "2013-06-22":25,
    "2013-05-14":546,
    "2013-03-11":20
}
4

3 回答 3

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; }
});

现在,如果您真的想要max/min value的,那就是这个。幸运的是,您的值是数字,因此它更容易一些:

var keys = _.keys(obj);
function itemgetter(key) { return obj[key]; }
minkey = _.min(keys, itemgetter);
maxkey = _.max(keys, itemgetter);
于 2013-06-26T17:34:06.713 回答
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

jsFiddle

于 2016-03-19T20:23:10.393 回答
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 

jsfiddle 上

或者按照@dandavisObject.keys的建议使用 ECMA5

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 上

在这种情况下(使用您的特定测试数据),输出将与前面的示例相同。

或者使用 ECMA5Object.keysArray.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 上

第二个例子很容易通过使用带有部分或全部这些方法的下划线来完成_.keys_.min并且_.max已经得到了回答。

于 2013-06-26T17:47:01.840 回答