Javascript: массивы, объекты, сортировка и прототипы? - PullRequest
2 голосов
/ 07 июля 2011

Я создал массив объектов и смог отсортировать по одному из свойств объектов (см. Нижний код). Но я жестко запрограммировал, по какому свойству сортировать (в данном случае «имя»). Как я мог бы передать методу сортировки свойство, по которому я ищу сортировку? Я попытался tmpArray.sort (функция (a, b, sortBy), но не получил ответа для вас. Я знаю, что могу изменить объект массива с

array.prototype.thing = function(){ alert("hello world"); } 

Но возможно ли мне изменить существующий метод, например array.sort? Спасибо.

$(document).ready(function(){

    $(".sort").click(function() { 

    var tmpArray = new Array;

    for (i=0; i<5; i++) { 

        var tmpObject = new Object;
        switch(i) { 

            case 0 : 
                tmpObject.name = "Amy";
                tmpObject.rank = 1;
                tmpObject.priority = 3;
                tmpObject.item = "Blue Item";
                break;

            case 1 :
                tmpObject.name = "Jen";
                tmpObject.rank = 2;
                tmpObject.priority = 0;
                tmpObject.item = "Red Item";
                break;

            case 2 :
                tmpObject.name = "Mike";
                tmpObject.rank = 3;
                tmpObject.priority = 2;
                tmpObject.item = "Green Item";
                break;

            case 3 :
                tmpObject.name = "Raul";
                tmpObject.rank = 4;
                tmpObject.priority = 2;
                tmpObject.item = "Yellow Item";
                break;                      

                            case 4 :
                tmpObject.name = "Lola";
                tmpObject.rank = 5;
                tmpObject.priority = 1;
                tmpObject.item = "Blue Item";
                break;                      

        }

        tmpArray.push(tmpObject); 
    }

    tmpArray.sort(function(a, b) {
             var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()

        if (nameA < nameB) //sort string ascending
            return -1
        if (nameA > nameB)
            return 1

        return 0 //default return value (no sorting)
        });

        console.log(tmpArray);

    });

});

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Быстрый пример, что-то вроде этого должно работать.arr - массив для сортировки, key - ключ объекта для использования.Имейте в виду, это только один уровень глубокой сортировки.

var arr = [
    {"one" : Math.random(), "two" : Math.random(), "id" : "First"},
    {"one" : Math.random(), "two" : Math.random(), "id" : "Second"},
    {"one" : Math.random(), "two" : Math.random(), "id" : "Third"}
];

var oSort = function (arr, key) {
    arr.sort(function(a, b) {
        a = a[key], b = b[key];
        return a > b ? 1 : a < b ? -1 : 0;
    });
};

oSort(arr, 'two');

http://jsfiddle.net/XwswP/

Изменить, чтобы ответить

Но я могу изменитьсуществующий метод, например, array.sort?Спасибо.

Да, это возможно, но не делайте этого.Если вы хотите перезаписать его, вы можете сделать
Array.prototype.sort = function() { ...

1 голос
/ 07 июля 2011

Вы можете написать a[someString], чтобы получить свойство, названное в переменной someString.

0 голосов
/ 07 июля 2011

Кажется, что ваш вид работает нормально:

http://jsfiddle.net/maniator/2nFYN/

...