2013-02-21 3 views
0

Я пытаюсь перебрать аргумент массива и возвращает первые п элементов переданного массива без использования стандартных JavaScript функций, таких как срез, CONCAT, толчок, поп и т.д. ...Javascript для цикла по аргументу массива

var n = 0; 
var anyArray = Array; 
var SR = {}; 
SR.first = function(anyArray,n){ 
var isArray = (Object.prototype.toString.apply(anyArray) === '[object Array]'); 
var specification = (typeof n === "number"); 
if(isArray && specification){ 
     for(i = 0; i < n; i++){ 
       return Array(anyArray[i]); 
      } 
     } 
    else if (isArray || !specification){ 
     return anyArray[0]; 
    } 
} 

Я не хочу строить возвращаемый массив «anyArray», используя + =. Итак, как бы я начал возвращать что-то вроде этого [1,2,3,4], когда «SR.first ([1,2,3,4,5,6,7], 4); называется?

+5

Почему вы это делаете? Что случилось с 'your_array.slice (0, 2)'? – Blender

+0

Должен сказать, мое любопытство также вызвано. Почему бы вам не захотеть использовать встроенные функции, встроенные в Javascript? Скорее всего, они будут гораздо более оптимизированы, чем ручные методы, как бы ближе к источнику (механизм javascript обычно настраивается на его собственный браузерный движок html ...). –

+0

Вы можете использовать 'filter':' [1, 2, 3, 4, 5, 6] .filter (function (i) {return i <= 2;}); ' – Blender

ответ

0

Я не понимаю, почему вы не хотели бы использовать Array операции, такие как push и slice, но это будет работать:

if (isArray && specification) { 
    var result = []; 
    for (var i = 0; i < n; i++) { 
    result[i] = anyArray[i]; 
    } 
    return result; 
} 
else ... 
0

Если по какой-то причине вы действительно не хотите использовать родные JavaScript функции , вы можете присвоить каждому элементу возвращаемый массив один за другим.

var returnArray = []; 

if(isArray && specification) { 
    for(i = 0; i < n; i++) { 
     returnArray[i] = anyArray[i]; 
    } 
} 

return returnArray; 
0
SR.first = function(anyArray,n){ 

    var newArray = []; 
    for(i = 0; i < n; i++){ 
     newArray[newArray.length] = anyArray[i]; 
    } 
    return newArray; 

} 
+0

newArray [i] = anyArray [i]; // не newArray.length! – eikes

+0

Вы можете делать, как я, без проблем. Это то же самое, на моем пути, я добавляю один элемент вовремя в 'newArray' –

0

Прежде всего - глобальная переменная это действительно плохая практика! Вам не нужно объявлять anyArray и n, потому что они являются аргументами функции и объявлены в вызове функции. Вторая проблема - вы можете поместить количество элементов больше длины массива - вы должны проверить эту ситуацию.

var SR = {}; 
SR.first = function(anyArray,n){ 
    var isArray = (anyArray instanceof Array), 
     specification = (typeof n === 'number'), 
     tmp = new Array; 
    console.log(isArray, specification); 
    if(isArray && specification){ 
     for(i = 0, l = anyArray.length; i < n && i < l; i++){ 
      tmp[i] = anyArray[i]; 
     } 
     return tmp; 
    } else if (isArray || !specification){ 
     return anyArray[0]; 
    } 
} 
+0

Спасибо Silver_Clash, это именно то, что я хотел и буду учиться. – swaggyP

1
var newArr = Array.apply(null, anyArray); // new Array using original content 

newArr.length = n; // truncate the length of the new Array 

return newArr;  // return it 

Один маленький крайний случай, когда будет anyArray имеет только один элемент, который представляет собой число. Вам нужно защититься от этого сценария.

+1

Мне нравится этот метод! – eikes

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