2016-11-18 70 views
0

雖然我新推出了JavaScript,但我已經制作了一些能夠在我的工作流程中發揮重要作用的腳本。然而,我現在正在開始一個項目,迫使我以一種我不知道如何在Javascript中完成的方式對數據進行排序。我會盡量解釋什麼,我需要做的,就好像我的數據是在Excel中,但它不是,我只能夠把數據在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 

我想他們這樣排序,首先由郵政編碼,然後由道路名,然後由均勻的路號下降,然後由奇數的路段上升。 根據這種新的排序我想要生成一個新的頁碼,但我想它以某種方式與(舊)變量「pagenumber」相關聯,所以我可以找到舊頁面並將其提取到一個帶有新頁面編號的新文檔。我並不是要求你們爲我編寫所有的代碼,但是我需要一些建議來首先了解是否有可能做到我認爲的那樣,其次,如果把數據放在四個不同的地方是對的數組,第三,如果它是更聰明的方式來保存數據,以便更密切地與彼此相關聯。給我你的想法。還有我應該閱讀的地方和技巧的提示表示讚賞。謝謝大家的答案。不過,我想指出的是,我在Acrobat DC中編寫我的代碼而不是用於Web。

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

就個人而言,我不使用的中間步驟,如果我能避免它...所以下面是等同於BOT地圖和排序在一個鏈接的命令

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

我試圖弄清楚這一點。你能告訴我val的含義嗎? – Heresh

+0

對不起,讓我重寫 –

+0

如果您閱讀[Array#map](https://developer.mozilla)。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - 查看有關回調參數的部分 - 使用參數'(itemValue,index,array)'調用每個項目的.map回調在數組 –

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