2015-10-12 3 views
0

У меня есть три источника данных, которые возвращают массивы в размере. Я хочу создать один массив результатов из них, одновременно ограничивая количество, которое я могу вернуть.Добавление нескольких массивов с ограничением

var array1 = ["one"]; 
var array2 = ["two", "three", "four"]; 
var array3 = ["five", "six", "seven"]; 

Я хочу только вернуть первые 6 результатов, но они могут исходить от любой из трех массивов в порядке. В приведенном выше примере я ожидаю, что вернется "one, two, three, four, five, six".

Я достиг этого, используя мультипликатор для петель, с несколькими, если заявления:

var tList = []; 
var tCount = 0; 
var tLimit = 5; 

for (i = 0; i < array1.length; i++) { 
    if (tCount <= tLimit) { 
     tList.push(array1[i]); 
     tCount++; 
    } 
} 

for(i = 0; i < array2.length; i++) { 
    if (tCount <= tLimit) { 
     tList.push(array2[i]); 
     tCount++; 
    } 
} 

for(i = 0; i < array3.length; i++) { 
    if (tCount <= tLimit) { 
     tList.push(array3[i]); 
     tCount++; 
    } 
} 

однако это не кажется, как лучший или tidiest подход к этому, Есть ли лучший способ достижения той же цели? без использования плагина, такого как подчеркивание.

вот jsfiddle играть с: https://jsfiddle.net/sju7g5dp/

+0

Соединить все массивы, а затем отрезают первые п элементов. '[] .concat (array1, array2, array3) .slice (0, 5)'. –

+0

@torazaburo это все еще лучшая практика, если сказать, что у первого массива было 6 результатов, чтобы все еще идти вперед и делать все остальное, а затем удалять их – gardni

+0

Если вы не ожидаете, что в общей сложности будет 10 000 элементов, и вы только хотите принять первые пять, то да. –

ответ

1

Метод concat() используется для соединения двух или более arrays.

Этот метод не изменяет существующие arrays, но возвращает новый array, содержащий значения соединенных arrays.

var array1 = ["one"]; 
var array2 = ["two", "three", "four"]; 
var array3 = ["five", "six", "seven"]; 
var result=array1.concat(array2,array3); 
console.log(result); 

затем просто нарезать,

result.slice(0,5)

+0

Как насчет * при ограничении суммы, которую я могу вернуть *? –

+1

, поэтому вы бы порекомендовали добавить все данные вместе, а затем просто удалить их после моего лимита? так скажите 'result.slice (0,5)'? – gardni

+0

@torazaburo только что обновил код, да, вы можете просто нарезать его, я пропустил его :) –

0
function take(limit) { 
    var result = [] 
    for (var i = 0, args = arguments.length - 1; result.length < limit && i < args; i++) 
    for (var j = 0, length = arguments[i].length; result.length < limit && j < length; j++) 
     result.push(arguments[i][j]) 
    return result 
} 

console.log(take(5, [1,2,3], [4,5], [6,7])) 
    /* output: [ 1, 2, 3, 4, 5 ] */ 

Может быть не приятны для глаз с для петель, но это не то, что вы хотите. Принимает до N элементов из произвольного количества источников массива.

0

Вот пример использования генераторов ES6.

Сначала напишите генератор, который генерирует элементы из массива массивов.

function *elts(arrays) { 
    for (let array of arrays) yield *array; 
} 

Далее take генератор дает первые п результаты итератора.

function *take(n, it) { 
    for (let x of it) if (n--) yield x; else break; 
} 

Теперь

var array1 = ["one"]; 
var array2 = ["two", "three", "four"]; 
var array3 = ["five", "six", "seven"]; 

var arrays = [array1, array2, array3]; 

console.log(Array.from(take(6, elts(arrays)))); 

> ["one", "two", "three", "four", "five", "six"]