2013-11-25 4 views
2

У меня есть 3 массивов сказать A, B, C А имеет a1, a2, a3 аналогично b1, b2, b3 для B и C.Массив печати в определенном порядке

Когда я печатаю их элементы, они приходят как этого

return(A)-->a1,a2,a3 
return(B)-->b1,b2,b3 
return(C)-->c1,c2,c3 

Как я мог манипулировать этот массив в другой массив, скажем, D, чтобы напечатать что-то вроде этого

return(D)--> 
a1,b1,c1,a2,b2,c2,a3,b3,c3 

Я использую JavaScript.

+0

Напишите пользовательскую функцию 'sort'. – Florent

ответ

0

Прежде всего, необходимо Concat массивы вместе:

var D = A.concat(B, C); 

Затем нанесите нужный вид:

D.sort(function(a, b) { 
    return // ... 
}); 

Если вы звоните sort() без аргументов, D будут отсортированы в алфавитном порядке.

+0

Что относительно значений, содержащих числовые части> 10? – C5H8NNaO4

+0

Я думаю, 'a1',' a2', 'aN' являются фиктивными значениями ... Если существуют реальные значения, написание функции сортировки не очень сложно. – Florent

3

Вы можете написать цикл для этого, если все они имеют одинаковую длину, как это:

var D = []; 

for(var i = 0; i<A.length; i++){ 
    D.push(A[i],B[i],C[i]); 
} 

return D; 
+0

Как это сделать, если у него есть переменное количество элементов в каждом массиве? – redV

+0

Вы хотите только индексы, которые все массивы имеют или конкатенируют более длинные массивы на конце, также как a1, b1, c1, a2, b2, c3, b3, c3? – Igle

+0

Мой вопрос был в том, что если A имеет a1, a2 и B имеет b1, b2, b3, b4. – redV

0

Если вам просто нужно сцепить все массивы, вы могли бы написать простую вспомогательную функцию, которая использует Array.prototype.reduce и Array.prototype.concat

function concatAll() { 
    return [].reduce.call (arguments, function (a,b) {return a.concat (b)},[]) 
} 

чтобы использовать его, просто вызовите его со всеми массивами, которые вы хотите объединить.

var a = ["a1", "a2", "a3"], 
    b = ["b1", "b2", "b3"], 
    c = ["c1", "c2", "c3"]; 

concatAll (a,b,c) //["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"] 

Если вам нужно отсортировать массив вам после этого тоже Array.prototype.sort принимает функцию в качестве параметра, который вы можете использовать для сортировки после числового значения первого, поставив на нее вес.

concatAll (a,b,c).sort(function (a, b) { 
    var aVals = a.match(/(\D*)(\d*)/), 
     bVals = b.match(/(\D*)(\d*)/), 
     weighted = [a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0, b[1] - a[1]] //[string,number] 

    return weighted[0] - 2 * weighted[1] // give the number a double weight 

}) //["a1", "b1", "c1", "a2", "b2", "c2", "a3", "b3", "c3"] 

Херес example на jsFiddle

+0

делает это произведение ..? Ур Fiddle .. – rahul888

+0

@ rahul888 Для меня это так, вы открыли консоль? Или просто вставьте вышеуказанный код в свою консоль – C5H8NNaO4

+0

@ rahul888 обновил скрипку, чтобы вместо этого добавить строковое представление массива к телу – C5H8NNaO4

1

То, что вы пытаетесь сделать, это называется zip operation. Javascript не имеет zip по умолчанию. Я написал небольшую функцию zip, которая может работать на вас, что она ожидает, так это то, что все массивы имеют одинаковую длину. Чтобы быть более точным, он хотел бы, чтобы все массивы имели по крайней мере столько элементов, сколько в элементе # 1. Это существенно делает то, что делает код @ Igle, за исключением того, что он использует немного другой подход и может принимать любое количество массивов.

Примечание: Вам может понадобиться сделать немного проверки ошибок в ниже код

var zip = function (array) { 
    return array.slice(1).reduce(function(prev,cur) { 
     return prev.map(function(x,i){ 
      return x.concat(cur[i]); 
     }); 
    }, array[0].map(function(x){return [x];})); 
} 

zip ([ ['a1','a2','a3'] , ['b1','b2','b3'], ['c1','c2','c3'] ]); 

Выходы:

[["a1","b1","c1"],["a2","b2","c2"],["a3","b3","c3"]] 

UPDATE:

Я нашел другой пылесос реализация zip по сравнению с предыдущим.Посмотрите здесь: Javascript equivalent of Python's zip function

Смежные вопросы