2012-06-12 84 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:对,我已经纠正它。 –