2014-09-29 3 views
1

Это мой следующий код:JavaScript определение размера массива и клонирования из другого массива

customQuestionnaire['questions'] = customQuestionnaire['questions'].slice(0,numberOfQuestions); 

Я хочу, чтобы выводить размер массива из numberOfQuestions и еще копирования до массива numberOfQuestions старше. Это работает, если массив ранее был больше. Но что, если массив ранее был меньше, и я хочу объявить более крупный массив (остальное - «undefined»)? Должен ли я это делать? Или приведенный выше код достаточно.

var temp = customQuestionnaire['questions'].slice(0,numberOfQuestions); 
customQuestionnaire['questions'] = new Array(numberOfQuestions); 
customQuestionnaire['questions'] = temp.slice(); 

Но это выглядит так же, как и предыдущий код. Как мне это сделать? Благодарю.

ответ

0

Я бы предложил заполнить остальную часть массива до нужной длины с неопределенными значениями. Например:

var numberOfQuestions = 10; 
var arr = [1,2,3,4,5]; 
var result = arr.slice(0,numberOfQuestions); 

if(numberOfQuestions > arr.length){ 
    var interations = numberOfQuestions - arr.length; 
    for(var i =0; i< interations; i++){ 
     result.push(undefined); 
    } 
} 
console.log(result); 

для данного примера результат:

[1, 2, 3, 4, 5, undefined, undefined, undefined, undefined, undefined] 

Так у вас есть новый массив с длиной numberOfQuestions. Существующие значения копируются, и если вы попытаетесь использовать значения, которые не определены, вы получите erro

0

Код, который использует temp var, не будет отличаться от вашего исходного кода.

// This creates a copy of the array stored in customQuestionnaire['questions'] 
// and stores it in temp 
var temp = customQuestionnaire['questions'].slice(0,numberOfQuestions); 

// this creates a new empty array with a length of numberOfQuestions and 
// stores it in customQuestionnaire['questions'] 
customQuestionnaire['questions'] = new Array(numberOfQuestions); 

// this creates a copy of the array stored in temp (itself a copy) and 
// immediately overwrites the array created in the last step with this copy of 
// the array we created in the first step. 
customQuestionnaire['questions'] = temp.slice(); 

Использование .slice создает копию массива вы вызываете метод, но так как вы сразу перезапись массива, я предполагаю, что вам не нужно, чтобы сохранить исходное значение customQuestionnaire['questions'].

Самый простой (и, вероятно, самый эффективный) способ выполнить то, что вы хотите, - просто отрегулировать .length property массива.

customQuestionnaire['questions'].length = numberOfQuestions; 

Если numberOfQuestions короче, чем длина массива это усечь массив numberOfQuestions вопросов. Если numberOfQuestions длиннее массива, массив будет мутировать в массив, содержащий numberOfQuestions элементов, элементы, выходящие за пределы исходного массива, будут undefined по вашему желанию.

Если вам нужно скопировать исходный массив, вы можете все еще использовать .slice, чтобы сделать это:

var questionnaire = customQuestionnaire['questions'].slice(); 
questionnaire.length = numberOfQuestions; 
// do something with questionnaire 
Смежные вопросы