2016-06-01 6 views
0

У меня есть массив:Как создать многомерный массив/массив из списка массива?

["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"] 

Задача состоит в том, чтобы сделать массив в массиве для комбинированной длины 10 символов, который в этом случае будет что-то вроде этого:

[ 
    ["Lorem", "Ipsum"], 
    ["Colo", "sit", "ame"], 
    ["consecteur"] 
] 

Я пытался сделать это:

var arr = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
var combArr = []; 
var charCount = 0; 

for (i = 0; i < arr.length; i++) { 
    charCount += arr[i].length; 
    if (charCount <= 10) { 
     combArr.push(arr[i]); 
    } 
    if (charCount > 10 && charCount <= 20) { 
     combArr.push(arr[i]); 
    } 
    // ... 
} 

Но тогда это будет толкать его обратно в том же порядке, как и раньше, так как я только толкая каждую итерацию, вынесший состояние. Я не знаю, как сделать многомерный массив, как указано выше. Любая помощь будет оценена по достоинству. Благодаря!

+0

Довольно похоже на http://stackoverflow.com/questions/37470910/break-long-string-at-specif-char-and-max-length-js - просто удалите требование конкретного символа. –

ответ

1

Вот исправленная версия кода:

var arr = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
var combArr = []; 
var charCount = 0; 
var currArr = []; // ADDED: the current list of words 

for (i = 0; i < arr.length; i++) { 
    if (charCount && (charCount + arr[i].length > 10)) { 
     // save list 
     combArr.push(currArr); 
     // ... and start new list 
     currArr = []; 
     charCount = 0; 
    } 
    charCount += arr[i].length; 
    currArr.push(arr[i]); 
} 
// finally add remaining list to result: 
combArr.push(currArr); 
+0

Создает пустую строку для '[" 12345678901 "," 2 "]' –

+0

Спасибо, что выделили это. Исправленный. – trincot

+0

Спасибо вам большое! – astrasleepz

1

Главное, что вам не хватает; Вам нужно создать новых массивов, а затем вставить эти множественные массивы в родительский массив.

Пример, чтобы вы пошли;

var container = []; 
var child1 = []; 
var child2 = []; 

child1.push("foo"); 
child1.push("bar"); 

child2.push("baz"); 

container.push(child1); 
container.push(child2); 

console.log(container); // [["foo", "bar"], ["baz"]] 

Я оставлю условную логику проблемы под рукой, но это должно помочь вам преодолеть этот барьер. Удачи!

0

Попробуйте это; (Изм)

var arr = ["1234567890","hidden","para","meter"]; 
 
    var results= []; 
 
    var charCount = 0; 
 
    var temp=[]; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     charCount += arr[i].length; 
 
     if(charCount>10){ 
 
      results.push(temp); 
 
      charCount=arr[i].length; 
 
      temp=[arr[i]]; 
 
     }else{ 
 
      temp.push(arr[i]); 
 
     } 
 
    } 
 
    if(temp.length){results.push(temp);} 
 
    document.write(JSON.stringify(results))

Попробуйте это;

var arr = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
 
var results= []; 
 
var charCount = 0; 
 

 
for (var i = 0,temp=[]; i < arr.length; i++) { 
 
    if((charCount += arr[i].length)>=10){ 
 
     temp.push(arr[i]); 
 
     results.push(temp); 
 
     charCount=0; 
 
     temp=[]; 
 
    }else{ 
 
     temp.push(arr[i]); 
 
    } 
 
} 
 
document.write(JSON.stringify(results))

+0

Не работает для '[" 1234567890 "," hidden "];' –

0

Вы можете попробовать что-то вроде этого.

var arr = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
 
var MAX_LENGTH = 10; 
 
var finalArray = arr.reduce(function(prev, curr) { 
 
    if (prev.length === 0) { 
 
    prev.push([curr]); 
 
    } else { 
 
    var currentItemLength = prev[prev.length-1].reduce(function(iprev, icurr) { 
 
     return iprev + icurr.length; 
 
    }, 0); 
 
    if (currentItemLength + curr.length > MAX_LENGTH) { 
 
     prev.push([curr]); 
 
    } else { 
 
     prev[prev.length-1].push(curr); 
 
    } 
 
    } 
 
    return prev; 
 
}, []); 
 
console.log(finalArray)

0

Вы можете исправить свой код, добавив еще один уровень вложенности к вашим combArr, сбрасывая ваш charCount для каждой новой «строки» и обработки случая, когда первое вхождение arr больше чем 10 символов путем добавления || i == 0 к вашему, если состояние:

var arr = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
 
var combArr = [[]]; 
 
var charCount = 0; 
 

 
for (i = 0; i < arr.length; i++) { 
 
    charCount += arr[i].length; 
 
    if (charCount <= 10 || i == 0) { 
 
     combArr[combArr.length-1].push(arr[i]); 
 
    } else { 
 
     charCount = arr[i].length; 
 
     combArr.push([arr[i]]); 
 
    } 
 
} 
 

 
console.log(combArr);

Более производительное решение:

function format(array, chars) { 
 
    var result = [], chars = 0, prev = 0, length = array.length; 
 
    for (var i = 0; i < length; ++i) { 
 
    chars += array[i].length; 
 
    if (i && chars > 10) { 
 
     result.push(array.slice(prev, i)); 
 
     chars = array[i].length; 
 
     prev = i; 
 
    } 
 
    } 
 
    result.push(array.slice(prev, length)); 
 
    return result; 
 
} 
 

 
console.log(format(["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"])); 
 
console.log(format(["12345678901", "", "1234567890", "", "1"]));

0

Это решение не обслужить:

  1. Массив ввода не находится в правильном порядке, с тем чтобы обеспечить полное спаривание 10 символов, например, оно не будет работать с входным массивом ["hello", "whatever"].
  2. Он не предназначен для условного разделения элемента массива на два отдельных массива. Для примера [ "привет", "все"] = [[ "привет", "whate"], [ "веры"]]

Так с информации, вы можете попробовать это:

var inputArray = ["Lorem", "Ipsum", "Colo", "sit", "ame", "consecteur"]; 
    var tempArray = []; 
    var finalArray = []; 
    var charCount = 0; 

    for (i = 0; i < inputArray.length; i++) { 

     if ((charCount + inputArray[i].length) <= 10) { 

      charCount += inputArray[i].length; 

      tempArray.push(inputArray[i]); 

      if (charCount == 10) { 
       finalArray.push(tempArray); 
       tempArray = []; 
       charCount = 0; 
      } 
     } 
    } 

    //push whatever remains is in tempArray to the final array. 
    if (tempArray.length) 
     finalArray.push(tempArray); 

    document.write(JSON.stringify(finalArray)) 
Смежные вопросы