2015-12-30 4 views
0

у меня есть два массива с строковыми данными:Сортировка массива с строковыми данными на Javascript

var AA = ["~/80/Blue/1.png","~/80/Blue/2.png","~/80/Black/1.png","~/80/Black/2.png"]; 
var BB = ["~/81/Blue/1.png","~/81/Blue/2.png","~/81/Black/1.png","~/81/Black/2.png"]; 

Мне нужно .concat эти массивы и .sort как это:

CC = ["~/80/Blue/1.png","~/81/Blue/1.png","~/80/Blue/2.png","~/81/Blue/2.png","~/80/Black/1.png","~/81/Black/1.png","~/80/Black/2.png","~/81/Black/2.png"]; 

Критерий сортировки, что Мне нужно иметь пары элементов массива с одним и тем же «цветовым каталогом» и тем же именем файла.

Я попытался это:

var CC = AA.concat(BB); 
CC.sort (function(a,b) { 
    var Mask = /\W\w+\W\d\Wpng/; 
    var A =[]; 
    var B = []; 
    var s1 = a.toLowerCase(); 
    var s2 = b.toLowerCase(); 
    for (var i=0; i<s1.length; i++){ 
     A.push(s1[i].match(Mask)); 
    } 
    for (var i=0; i<s2.length; i++){ 
     B.push(s2[i].match(Mask)); 
    } 
    for (var i=0; i<A.length; i++){ 
     for (var j=0; j<B.length; j++){ 
     if (A[i] < B[j]) {return -1;}; 
     if (A[i] > B[j]) {return 1;}; 
     else {return 0;} 
     } 
    } 
+0

Что вы попробовали? Пожалуйста, посетите Справочный центр, чтобы получить совет по заданию вопросов. – prasun

+0

. Пожалуйста, отредактируйте и добавьте в свой вопрос, так, чтобы он был читаемым пользователям – prasun

+0

. Критерии сортировки? – udnisap

ответ

0

Во-первых, CONCAT двух массивов, а затем сортировать, используя метод Arrays.sort, путем пропускания желаемой логики сортировки в качестве параметра sortFunction.

var AA = ["~/80/Blue/1.png","~/80/Blue/2.png","~/80/Black/1.png","~/80/Black/2.png"]; 
var BB = ["~/81/Blue/1.png","~/81/Blue/2.png","~/81/Black/1.png","~/81/Black/2.png"]; 
var CC = []; 


var CC = AA.concat(BB); 

function string_split_comparator(a, b) { 
    var A_colorFile = a.split('/').splice(2).join('/'); /* Blue/1.png */     
    var B_colorFile = b.split('/').splice(2).join('/'); 
    var A_directoryNum = a.split('/')[1]; /* 80 */ 
    var B_directoryNum = b.split('/')[1]; 
    if(A_colorFile !== B_colorFile){ 
     return A_colorFile < B_colorFile; 
    } else{ 
     return A_directoryNum < B_directoryNum 
    } 

} 
CC.sort(string_split_comparator); 
+0

A и B не определены. – Vlad

+0

@ Vlad: И вы упомянули цвета, отсортированные в обратном алфавитном порядке. Это было намеренно? Я имею в виду, вам нужно «Синее» после «Черного» или наоборот? – SarathChandra

+0

это не важно для меня. Ваш код работает для меня. – Vlad

0
var AA = ["~/80/Blue/1.png","~/80/Blue/2.png","~/80/Black/1.png","~/80/Black/2.png"]; 
var BB = ["~/81/Blue/1.png","~/81/Blue/2.png","~/81/Black/1.png","~/81/Black/2.png"]; 
var CC = []; 

var longestArr = 0; 

if (AA.length > BB.length) { 
longestArr = AA.length; 
} else { 
longestArr = BB.length; 
} 

    for (var i = 0; i < longestArr; i++) { 
     if (AA[i]!==undefined) { 
     CC.push(AA[i]); 
     }; 
     if (BB[i]!==undefined) { 
     CC.push(BB[i]); 
     }; 
    } 

Является ли это то, что вы хотели?

+0

В конце вы оставите некоторые неопределенные значения. –

+0

@torazaburo отредактирован, теперь он не будет – aex

0

Вот как zip два массива одинаковой длины.

var CC = AA.reduce(function(result, value, i) { 
    return result.concat(value, BB[i]); 
}, []); 

JSFiddle Демо: https://jsfiddle.net/uh0q2eqb/

Вот как сортировать массивы одинаковой длины на основе имени каталога и имени файла в виде строки, а затем сжать их.

AA.sort(comparator); 
BB.sort(comparator); 

var CC = AA.reduce(function(result, value, i) { 
    return result.concat(value, BB[i]); 
}, []); 

function comparator(a, b) { 
    var A = a.split('/').splice(2).join('/'); 
    var B = b.split('/').splice(2).join('/'); 

    if (A > B) { 
    return 1; 
    } else if (A < B) { 
    return -1; 
    } else { 
    return 0; 
    } 
} 

JSFiddle Демонстрация: https://jsfiddle.net/uh0q2eqb/1/