2016-11-18 4 views
0

Я новичок в javascript, но я уже сделал несколько сценариев, которые действительно влияют на мой рабочий процесс. Однако теперь я приступаю к проекту, который заставляет меня сортировать данные так, как я не знаю, как это сделать в Javascript. Я попытаюсь объяснить, что мне нужно делать, если мои данные были первенствует, но оно не, я только был в состоянии поместить данные в 4-х различных массивов:Сортировка массивов, переменных или объектов в Javascript

pagenumber[1,2,3,4,5] //only numbers 
zipcode[77889,99887,33667,11122,44559] // only numbers 
streetname[Hillroad, Hillroad, Baghdad Street, Hongway, Chinatown] //only letters 
roadnumber[55,27,1,13,16] //only numbers 

Я хотел бы сортировать их, как это , сначала по zipcode, затем по дорожке, затем по ровным дорожкам, спускающимся, затем по нечетным дорожным дорогам, восходящим. В соответствии с этой новой сортировкой я хочу создать новый pagenumber, но я хочу, чтобы он каким-то образом относился к (старой) переменной «pagenumber», поэтому я могу найти старую страницу и извлечь ее в новый документ с новыми pagenumbers. Я не прошу вас, ребята, написать весь код для меня, но мне нужно немного советовать сначала, если это возможно, что я думаю, что это так, во-вторых, если я прав, чтобы поместить данные в четыре разных массивы, в-третьих, если это любой (конечно) разумный способ сохранить данные, чтобы они более тесно связаны друг с другом. Дайте мне свои мысли. Также приветствуются советы о том, где и что я должен читать. Спасибо всем за ответы. Однако я хочу указать, что я пишу свой код в Acrobat DC не для Интернета.

+0

что вы сделали до сих пор в плане сортировки любого из этих массивов ?? Пожалуйста, покажите нам – HenryDev

+0

Я вообще не сортировал его. Не знаю, как. Но я буду! – Heresh

+0

, если каждый индекс в каждом массиве относится к единому объекту ... т.е. индекс 0 = 1, 77889, Hillroad, 55 и т. Д., Поэтому при сортировке одного массива вам также нужно переупорядочить другие массивы, тогда у вас есть наименее эффективный способ хранения ваших данных, о которых я мог думать! –

ответ

2

Я полагаю, что элементы в ваших массивах привязаны. Таким образом, вы должны использовать [{},{},{},{},{}] вместо 4 массивов. var items = [{pagenumber:1,zipcode:77889,streetname:Hillroad,roadnumber:55},{...},{...},{...},{...}] Затем сортировать каждое свойство ключ-значение один-на-один, как показано ниже:

var x= [ {a:2,b:2,c:3}, {a:1,b:1,c:1}, {a:1,b:2,c:3}, {a:2,b:2,c:2} ]; 

x.sort(function(item1, item2){ 
    var sort_a = item1.a-item2.a; 
    if (sort_a) return sort_a; 
    var sort_b = item1.b-item2.b; 
    if (sort_b) return sort_b; 
    var sort_c = item1.c-item2.c; 
    if (sort_c) return sort_c; 
}) 

Или упрощать быть

x.sort(function(item1, item2){ 
    return (item1.a-item2.a) || (item1.b-item2.b) || (item1.c-item2.c); 
}) 
+0

Как это помогает при сортировке строк, таких как название улицы? –

+0

Для строк используется 'item1.someStringKey.localCompare (item2.someStringKey)'. – Xufox

+0

@Xufox Классный метод, я не думал о сравнении строк. – jiajianrong

1

Учитывая данные:

var pagenumber=[1,2,3,4,5]; //only numbers 
var zipcode=[77889,99887,33667,11122,44559]; // only numbers 
var streetname=['Hillroad', 'Hillroad', 'Baghdad Street', 'Hongway', 'Chinatown']; //only letters 
var roadnumber=[55,27,1,13,16]; //only numbers 

Первый , вам необходимо сделать ваши данные более легко управляемыми

var data = pagenumber.map(function(itemValue, index) { 
    return { 
     pagenumber:itemValue, // == pagenumber[index] 
     zipcode:zipcode[index], 
     streetname:streetname[index], 
     roadnumber:roadnumber[index] 
    }; 
}); 

Тогда разбирайтесь

data.sort(function(a, b) { 
    if (a.zipzode != b.zipcode) { 
     // numeric 
     return a.zipcode - b.zipcode; 
    } 
    if (a.streetname != b.streetname) { 
     // alpha 
     return a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0; 
    } 
    if (a.roadnumber % 2 != b.roadnumber % 2) { 
     // even before odd 
     return b.roadnumber % 2 - a.roadnumber % 2; 
    } 
    // numeric 
    return a.roadnumber - b.roadnumber; 
}); 

заимствования из другого ответа, который может быть упрощен

data.sort(function(a, b) { 
    return (a.zipcode - b.zipcode) || (a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0) || (b.roadnumber % 2 - a.roadnumber % 2) || (a.roadnumber - b.roadnumber); 
}); 

Лично я не использую промежуточный шаг, когда я могу избежать этого ... так следующее эквивалентно ЪоТ карту и сортировки в одну команду цепочечную

var sortedData = pagenumber.map(function(itemValue, index) { 
    return { 
     pagenumber:itemValue, 
     zipcode:zipcode[index], 
     streetname:streetname[index], 
     roadnumber:roadnumber[index] 
    }; 
}).sort(function(a, b) { 
    return (a.zipcode - b.zipcode) || (a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0) || (b.roadnumber % 2 - a.roadnumber % 2) || (a.roadnumber - b.roadnumber); 
}); 
+0

Im пытается понять это. Не могли бы вы рассказать мне, что означает вал? – Heresh

+0

Извините, позвольте мне переписать это –

+0

Если вы читаете о [Array # map] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - см. раздел о параметрах обратного вызова - обратный вызов .map вызывается с аргументами '(itemValue, index, array)' для каждого элемента в массиве –

0
// sorting zipcode in ascending order 
zipcode.sort(); 
// sorting streetname in ascending order 
streetname.sort(); 
// fetching evenroad numbers 
var roadnumbereven=roadnumber.filter(function(element, index, array) { 
    return (element % 2 === 0); 
}); 
// fetching odd roadnumbers 
var roadnumberodd = roadnumber.filter(function(element, index, array) { 
    return (element % 2 !== 0); 
}); 
// sorting even road numbers in ascending order 
roadnumbereven.sort(); 
// sorting odd road numbers in descending order 
roadnumberodd.sort(function(a,b){ return b-a; }); 
// merging roadnumbers(even/odd) 
roadnumber = roadnumbereven.concat(roadnumberodd); 


console.log(roadnumber); 
Смежные вопросы