JavaScript - создание массива с данными без зацикливания - PullRequest
1 голос
/ 23 июля 2011

Я хотел бы знать, возможно ли создать массив и инициализировать его одним и тем же объектом без необходимости зацикливания на каждом элементе.Я не хочу зацикливаться, потому что я мог бы вставить много элементов.это то, что я хотел бы сделать:

var array=new Array(10000);

, и я хотел бы, чтобы каждый элемент массива был одним и тем же объектом (кроме неопределенного :)) без необходимости делать это

for(i=0;i<array.length;i++)
    array[i]=object;

Я надеюсь, что я хочу сделать, это ясно для вас

Я нашел решение, но я использую функцию eval, поэтому я не уверен, что она лучшая, но она гораздо эффективнеечем цикл

Ваши советы приветствуются:)

вот как

var i="l,",l=new Object(),length=20000;
l.id=1;

while(i.length<length){
      i+=i;
}
i=i.substring(0,length-1);
i="["+i+"]";

var array=eval(i);

console.log(array);

спасибо

Ответы [ 10 ]

3 голосов
/ 23 июля 2011

Для массивов в JS не требуется выделять хранилище для элементов, когда вы это делаете new Array(10000); Вы получаете неопределенные элементы просто потому, что таких элементов нет - даже для них не выделено хранилище.Для создания элементов массива вы должны поместить их явно.

Но, если честно, я не понимаю, зачем вам это нужно.Достаточно поместить это:

var v = array[i] || object;

И v всегда будет иметь либо элемент, либо объект, если элемент не был определен.

1 голос
/ 26 мая 2017

Вот мое решение!

Это действительно No Loop способ создания массива!

const createNoLoopArray = (m, n) => {
    let arr = new Array(m+1);
    // let arr = [];
    // arr.length = m;
    return arr.join(n).split('').map((value) => parseInt(value, 10));
}

let result = createNoLoopArray(7, 3);
console.log(result);

// (7) [3, 3, 3, 3, 3, 3, 3]
1 голос
/ 04 декабря 2014

Я думаю, что вы можете сделать что-то вроде ниже, я попытался заполнить 50 1 без использования цикла, но я думаю, что внутренне разделить и объединить оба использует цикл.

var a = new Array(50).join(1).split('').join(',');
1 голос
/ 26 августа 2011

Я думаю, это то, что вы ищете!

function createMatrix ()
       {
         var matrix = Array.prototype.slice.call(arguments);
         return matrix.length > 0 ? matrix : [0] ;
       }

создать матрицу произвольной размерности createMatrix () -> [0]
createMatrix (1, 2, 3) -> [1,2,3] - строка вектора

createMatrix ([1], [2], [3]) -> [[1], [2], [3]] - векторный столбец

createMatrix ( [1, 2, 3], [4, 5, 6], [7, 8, 9] ) * +1010 *

-> [[1,2,3], [4,5,6], [7,8,9]] - матрица 3 × 3

1 голос
/ 23 июля 2011

В js такой встроенной функции нет, но вы можете создать ее для себя; Да, я внутри цикла функция myArray.

function myArray(size,defaultObj)
{
    var _array=[];
    for (i=0;i<size;i++)
    {
        _array[i]=defaultObj
    }
    return _array;
}

var myArray= myArray(3,"hello");

alert(myArray[2]);

http://jsfiddle.net/ZySst/

1 голос
/ 23 июля 2011

Нет и да @ см. Спецификацию массива .

Нет, так как в JS нет такого конструктора, как:

var a = new Array(10000, someObject);
// or
var a = Array.fill(0, 10000, someObject);

Да, как вы могли бы сделать это вручную:)

var a = new Array(someObject, someObject, someObject, ..., someObject); // 9996 elements ommited

А в вашем коде лучше сделать так:

for (var i = 0, iMax = array.length; i < iMax; i++) {
    array[i]=object;
}
  1. Добавить переменную внутри для инициализации счетчика
  2. Используйте другую локальную переменную вместо array.length, так как она немного ближе по объему
0 голосов
/ 16 октября 2013

Я бы сказал, что ответ на ваш вопрос: это невозможно.

Не на Java и, вероятно, не на любом другом языке программирования.

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

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

0 голосов
/ 24 июля 2011

Это лучшее решение, которое я нашел, не использует eval, и цикл не слишком длинный, чтобы браузер не зависал:

var j=0,l=new Object();
l.id=1
var array=[l];

while(array.length<10000){
     array=array.concat(array);
}
array=array.slice(0,10000);
console.log(array.length);

Ну, конечно, чем больше длина массива перед циклом, тем быстрее цикл.

0 голосов
/ 23 июля 2011

Нет, я не думаю, что это возможно в обычном JavaScript.

Этот код создаст Array, содержащий 10 нулей:

var array = [ ] , filler = 1 ;
var i = 0 , length = 10 ;

while(i < length) array.push(filler) , i = i + 1;

alert("(!) array >> " + array) ;

( Попробуйтездесь )

0 голосов
/ 23 июля 2011

Вероятно, не практическое решение и не будет работать в IE <9, но технически нет (явного) цикла: </p>

var a = [];
a.length = 10000;
a.forEach(function(e, i) {
    a[i] = object;
});
...