2012-06-12 119 views
0

這可能會有點混亂,我不知道是否有可能,但我會很感激任何幫助。 我有以下陣列(該項目,並列出可能發生變化的數字,這只是一個例子):比較和排序的JavaScript陣列

var list_1 = ["A - 2" , "E - 5" , "C - 7"]; 
var list_2 = ["D - 2" , "A - 2" , "E - 3"]; 
var list_3 = ["C - 1" , "E - 8" , "A - 7"]; 

我的預期成果是:

var final = ["A - 2" , "C - 1" , "D - 2" , "E - 3"]; 

我試圖要做的事:

我想弄清楚如何去通過每個數組項目,看看該項目的開頭字母是否存在於前一個數組中,如果該項目中的數字低於上一個項目,請將其替換到「最終」列表中。

任何想法,或者這是不可能的?

jQuery是可以接受的

+1

爲什麼「C-1」出現在「A-2」之前,即使「A-2」在第一個數組中先出現? –

+0

@AndrewPeacock - 我認爲他所說的是整數在字母前先排序爲ASC。 –

+0

對不起,我不確定我看到了問題。這只是寫一個copule循環的問題。你需要[循環的語法](https://developer.mozilla.org/en/JavaScript/Reference/Statements/for)的幫助嗎?或者是什麼? –

回答

2
var list_1 = ["A - 2" , "E - 5" , "C - 7"]; 
var list_2 = ["D - 2" , "A - 2" , "E - 3"]; 
var list_3 = ["C - 1" , "E - 8" , "A - 7"]; 

首先,合併名單(第三+二+第一):

var list = list_3.concat(list_2).concat(list_1); 

創建一個映射到你打算把最低的數字,對每個字母:

var final_map = {}; 

遍歷分割每個項目的信(parts[0])和數字的所有項目(parts[1]) 。

您會得到給定字母的當前最小編號。如果沒有號碼或新號碼低於當前最低號碼,則更新地圖。

list.forEach(function (item) { 
    var parts = item.split(' - '); 
    var current = final_map[parts[0]]; 

    if (!current || parts[1] < current) { 
    final_map[parts[0]] = parts[1]; 
    } 
}); 

最後,將地圖轉換爲數組。

var final = []; 
Object.keys(final_map).sort().forEach(function (key) { 
    final.push(key + ' - ' + final_map[key]); 
}); 
0

你必須手動完成數組:

var final = []; 
$.each(list_1, function(i) { 
    // get each of your elements at index i. Ex list_1[i] 
    // do the comparison, and push them to an final 
    // possibly split the current element to match the letter and number 
}) 
0

好,你幾乎回答了你自己你的問題。現在你需要的是將人類可讀的算法改爲JavaScript。使用for.length元素遍歷整個列表,使用String.substring或正則表達式分割數據並在對象中保存最大查找數,其中字母將是鍵和數字 - 值。然後在另一個for循環和sort循環中創建最終數組,並指定自定義函數。

0

我只是創建一個散列表,該鍵將是整數,而值將只是一個字母列表。 比您需要打印的時間還要長,只要數值沒有被使用過,您只需通過鍵+值。 你也可以編寫你自己的排序函數,真的會看數字第一

0

我會使用查找來保存當前值並遍歷數組。

重新排列名單正因爲如此,

var lists = [["A - 2" , "E - 5" , "C - 7"], 
      ["D - 2" , "A - 2" , "E - 3"], 
      ["C - 1" , "E - 8" , "A - 7"]]; 

利用這一點,

var f = {}; 
for (var i = 0; i < lists.length; i++) { 
    for (var j = 0; j < lists[i].length; j++) { 
    var s = lists[i][j].split(' - '); 
    var ex = f[s[0]]; 
    if (!ex || ex > s[1]) 
     f[s[0]] = s[1]; 
    } 
}; 
var a = []; 
for (var obj in f) { 
    if (f.hasOwnProperty(obj)) { 
    a.push('' + obj + ' - ' + f[obj]); 
    } 
}; 

給人

["A - 2", "E - 3", "C - 1", "D - 2"] 
+0

'!ex || (ex && ex> s [1])'與'!ex ||相同ex> s [1]' –

+0

@JanKuča:對,我已經糾正它。 –