О функции сортировки для javascript

Предпосылки:

При необходимости в какой-то задаче мне понадобится простая функция сортировки. Для простоты я написал другую функцию для обертывания встроенной функции сортировки следующим образом:

function sortBy(obj, extra, func){
    if(typeof func == 'function'){
        f = func;
    } else if(typeof extra != 'function'){
        eval('function f(a, b, ai, bi, e){return ' + func + '}');
    } else {
        var f = extra;
        extra = null;
    }

    var res = [];
    for(var i in obj){
        if(obj.hasOwnProperty(i)){
            obj[i]._k_ = i;
            res.push(obj[i]);
        }
    }

    res.sort(function(a, b){
        if(f(a, b, a._k_, b._k_, extra)){
            return 1;
        } else {
            return -1;
        }
    })

    return res;
}

Мои попытки:

  1. Сделать возможным сортировку объекта напрямую
  2. Сохранить исходный объект как хэш-таблицу
  3. Разрешить простой синтаксис

Например,

var data ={
    12: {age:27, name:'pop', role: 'Programmer'},
    32: {age:25, name:'james', role: 'Accontant'},
    123:{age:19, name:'jerry', role:'Sales Representative'},
    15:{age:22, name:'jerry', role:'Coder'},
    17:{age:19, name:'jerry', role:'Tester'},
    43:{age:14, name:'anna', role: 'Manager'},
    55: {age:31, name:'luke', role:'Analyst'}
};

Есть несколько вариантов использования:

var b = sortBy(data, '', 'a.age < b.age'); // a simple sort, order by age
var b = sortBy(data, 19, 'b.age == e');    // pick up all records of age 19, and put them in the beginning
var b = sortBy(data, function(a, b){return a.name > b.name});  // anonymous sort function is also allowed

ВОПРОС

Хотя в нашем коде он работает должным образом, я хотел бы задать вопрос:

  1. Есть ли есть ли потенциальная проблема с использованием eval для создания функции сортировки из строки?
  2. Есть ли какая-нибудь история о том, что функция сортировки возвращает -1 (отрицательный), 0 и 1 (положительный)? Можем ли мы изменить код как «return if (f (a, b, a. k , b. k , extra)» вместо того, чтобы возвращать 1 или -1? он работает в нашем Firefox и Chrome, но не уверен, безопасно ли это делать.
5
задан mu is too short 22 June 2011 в 14:57
поделиться