JavaScript - 使用数据创建数组而不进行循环

时间:2011-07-23 14:59:38

标签: javascript arrays loops insert initialization

我想知道是否可以创建一个数组并使用相同的对象初始化它,而不必在每个元素上循环。我不想循环,因为我可能必须插入许多元素。 这就是我希望能够做到的:

var array=new Array(10000);

我希望数组的每个元素都是同一个对象(除了undefined :) 无需这样做

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 个答案:

答案 0 :(得分:3)

当您执行new Array(10000);时,JS中的数组不需要为元素分配存储。您只是因为没有这样的元素而得到未定义的元素 - 甚至没有为它们分配存储空间。要创建数组的元素,您必须明确地放置它们。

但说实话,我不明白为什么你需要那个。这就足够了:

var v = array[i] || object;

如果未定义元素,v将始终具有元素或对象。

答案 1 :(得分:1)

否和是@see array spec

不,就像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. 为计数器初始化添加var里面
  2. 使用另一个局部变量而不是array.length,因为它的范围更接近

答案 2 :(得分:1)

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/

答案 3 :(得分:1)

我认为这就是你要找的东西!

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

创建任意维度的矩阵createMatrix() - &gt; [0]
  createMatrix(1,2,3) - &gt; [1,2,3] - 向量行

     

createMatrix([1],[2],[3]) - &gt; [[1],[2],[3]] - 矢量列

     

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

     

- &GT; [[1,2,3],[4,5,6],[7,8,9]] - 3×3矩阵

答案 4 :(得分:1)

我认为你可以做类似下面的事情,我已经尝试在不使用循环的情况下填充50个1,但我认为内部拆分和连接都使用循环。

var a = new Array(50).join(1).split('').join(',');

答案 5 :(得分:1)

这是我的解决方案!

  

这是创建数组的真正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]

答案 6 :(得分:0)

不,我认为这不可能在vanilla JavaScript中使用。

此代码将创建一个包含10个零的Array

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

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

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

try it here

答案 7 :(得分:0)

这是我找到的最佳解决方案,不使用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);

当然,数组的长度在循环之前越大,循环越快。

答案 8 :(得分:0)

我会说你的问题的答案是:它无法完成。

不是Java,可能不是任何其他编程语言。

如果你考虑底层机器,你要求的是:可以存储区域 n特定类型的值初始化为相同的值而不循环。

我想如果底层机器中有一些特殊的机制,例如没有循环,这是可能的。一种使内存区域无效的方法。但即便如此,在大多数情况下,该机制实际上会遍历所有值。

答案 9 :(得分:-1)

可能不是一个实用的解决方案,并且不适用于IE&lt; 9,但技术上没有(显式)循环:

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