2015-06-17 4 views
0

У меня есть массив объектов JavaScript:Сортировка массива объектов по значению подмассива свойств в JavaScript

var people = [ 
{ 
    "name": "Edward", 
    "age": 100, 
    "wallet": { 
     "location": "home", 
     "cash": 500 
    }, 
    "bank": { 
     "location": "bank street", 
     "cash": 22100 
    } 
}, 
{ 
    "name": "Lisa", 
    "age": 30, 
    "wallet": { 
     "location": "home", 
     "cash": 20 
    }, 
    "bank": { 
     "location": "bank street", 
     "cash": 12340 
    } 
}, 
{ 
    "name": "Elisabeth", 
    "age": 50, 
    "wallet": { 
     "location": "home", 
     "cash": 200 
    }, 
    "bank": { 
     "location": "bank street", 
     "cash": 5000 
    } 
} 
]; 

Как я могу сортировать их по wallet.cash?

Этот следующий пример (от Ege Özcan) работает, если я хотел сортировать эти объекты по имени или возрасту, но мне сложно изменить его для работы с многомерным ключом.

function dynamicSort(property) { 
var sortOrder = 1; 
if(property[0] === "-") { 
    sortOrder = -1; 
    property = property.substr(1); 
} 
return function (a,b) { 
    var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; 
    return result * sortOrder; 
} 
} 

Это работает:

people.sort(dynamicSort("name")); 

Это не:

people.sort(dynamicSort("wallet.cash")); 

Спасибо заранее!

ответ

0

Вы можете передать два различных аргументы функции dynamicSort

function dynamicSort(property1,property2) { 
var sortOrder = 1; 
if(property1[0] === "-") { 
    sortOrder = -1; 
    property1 = property1.substr(1); 
} 
return function (a,b) { 
    var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0; 
    return result * sortOrder; 
} 
} 

А затем вызвать

dynamicSort("wallet","cash"); 

DEMO

var people = [ 
 
{ 
 
    "name": "Edward", 
 
    "age": 100, 
 
    "wallet": { 
 
     "location": "home", 
 
     "cash": 500 
 
    }, 
 
    "bank": { 
 
     "location": "bank street", 
 
     "cash": 22100 
 
    } 
 
}, 
 
{ 
 
    "name": "Lisa", 
 
    "age": 30, 
 
    "wallet": { 
 
     "location": "home", 
 
     "cash": 20 
 
    }, 
 
    "bank": { 
 
     "location": "bank street", 
 
     "cash": 12340 
 
    } 
 
}, 
 
{ 
 
    "name": "Elisabeth", 
 
    "age": 50, 
 
    "wallet": { 
 
     "location": "home", 
 
     "cash": 200 
 
    }, 
 
    "bank": { 
 
     "location": "bank street", 
 
     "cash": 5000 
 
    } 
 
} 
 
]; 
 

 
    function dynamicSort(property1,property2) { 
 
    var sortOrder = 1; 
 
    if(property1[0] === "-") { 
 
     sortOrder = -1; 
 
     property1 = property1.substr(1); 
 
    } 
 
    return function (a,b) { 
 
     var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0; 
 
     return result * sortOrder; 
 
    } 
 
    } 
 

 
alert(JSON.stringify(people.sort(dynamicSort("wallet","cash"))))

+0

Спасибо человек! Это именно то, что я искал. В первой части кода отсутствует свойство -> свойство1 изменяется. – Beeq

0

Подъемное эту функцию сравнения с here, вы можете сделать:

function compare(a,b) { 
    if (a.wallet.cash < b.wallet.cash) 
    return -1; 
    if (a.wallet.cash > b.wallet.cash) 
    return 1; 
    return 0; 
} 

var people = [...]; 
console.log(people.sort(compare)); 
0

Вы можете использовать Object.byString метод из this stackoverflow answer и изменить код так:

function dynamicSort(property) { 
    var sortOrder = 1; 
    if(property[0] === "-") { 
     sortOrder = -1; 
     property = property.substr(1); 
    } 
    return function (a,b) { 
     var avalue = Object.byString(a, property); 
     var bvalue = Object.byString(b, property); 
     var result = (avalue < bvalue) ? -1 : (avalue > bvalue) ? 1 : 0; 
     return result * sortOrder; 
    } 
}