Javascript 从带有下划线的集合中获取最大和最小键

Javascript 从带有下划线的集合中获取最大和最小键,javascript,underscore.js,Javascript,Underscore.js,如何从这种带有下划线的集合中获取最大和最小键?这似乎是一项容易的任务,但我没有找到一个快速的解决方案 { "2013-06-26":839, "2013-06-25":50, "2013-06-22":25, "2013-05-14":546, "2013-03-11":20 } 不幸的是,u.min和u.max只支持数字,所以我们不能将它们用于字符串键。幸运的是,您的日期是字符串可排序格式 var minkey, maxkey; _.each(obj,

如何从这种带有下划线的集合中获取最大和最小键?这似乎是一项容易的任务,但我没有找到一个快速的解决方案

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

不幸的是,u.min和u.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; }
});

要获取对象的最大和最小键值,如果这确实是您的意思,而不是最大和最小值的键值(可能值得在您的问题中澄清),那么对于您给出的示例,您可以在POJ中这样做

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

或者按照@dandavis的建议使用ECMA5

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

另一方面,如果您想获取max和min值的键,那么可以在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));
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));
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));
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));


第二个示例很容易通过将下划线与这些方法中的部分或全部一起使用来完成。
.keys
.min
.max
,并且已经得到了回答。

虽然这是一个古老的问题,但是对于相同的方法有一个单行解决方案,您可以将其链接起来

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

您想要什么样的输出?对象没有任何特定的键顺序。你是对的。然后是另一个问题-我如何从这个集合中获取最小和最大密钥?@SergeyBasharov:@Hamsu,我如何引用迭代器中的密钥?@SergeyBasharov:
var\u max=uu.max(obj,函数(obj){return obj;})
Object.keys(test).sort()[0]和Object.keys(test).sort().slice(-1)[0]一样短,而Math.max.apply(0,Object.keys(test))适用于数字键。事实上,当使用ECMA5或垫片时,这些都是可能的,可以在MDN页面上找到。@dandavis为第一个示例添加了您的ECMA5建议,为另一个示例添加了ECMA5解决方案。您的第一个示例给出了
无限
-无限
。我相信
\uuu.min
\uuu.max
只处理数值@嗯,以前从没注意到。谢谢