Javascript 在数组中存储对数组的引用

Javascript 在数组中存储对数组的引用,javascript,arrays,foreach,Javascript,Arrays,Foreach,我有几个这样的数组 var arr1 = ['name1', 'name2', 'name3'] //array of strings var arr2 = ['name4', 'name5', 'name6'] var arr3 = [....] 现在我想把上面的字符串数组转换成如下对象数组 arr1 = [{name: 'name1'}, {name:'name2'}, {name:'name3'}] 对于其他2个阵列也是如此 所以我想到了这个 var bigArray = [ar

我有几个这样的数组

var arr1 = ['name1', 'name2', 'name3']   //array of strings
var arr2 = ['name4', 'name5', 'name6']
var arr3 = [....]
现在我想把上面的字符串数组转换成如下对象数组

arr1 = [{name: 'name1'}, {name:'name2'}, {name:'name3'}] 
对于其他2个阵列也是如此

所以我想到了这个

var bigArray = [arr1, arr2, arr3]
bigArray.forEach(function(arr, index, bigArray) {
     bigArray[index] = arr.map(function(item) {       // here i am assigning to current element of bigArray
     return {
           name: item
           };
     });
});
正如您在
bigArray
上执行
forEach
时所看到的,我通过映射修改了它的每个数组(
arr1
arr2
,…)

在这之后,
forEach
bigArray
看起来像

[
   [{name: 'name1'}, {name:'name2'}, {name:'name3'}],
   [{name: 'name4'}, {name:'name5'}, {name:'name6'}],
   ....
]
但是
arr1
仍然是
['name1','name2','name3']
arr2
仍然是
['name4','name5','name6']

我在这里理解的是,
bigArray
不包含对
arr1
arr2
。。。。你知道我如何传递推荐信吗?还是我错过了什么

编辑:我想我无法清楚地解释我自己,所以就在这里-------- 我创建
bigArray
的原因是我有太多的
arr1
arr2
。。。所以我不想把map单独应用到每一个上面,所以我把它们放在一个叫做
bigArray
的大数组中,然后对它们执行
forEach
,方法就是你想要的;这将创建一个新的数组,这就是为什么您会看到您想要的结果

var arr1 = ['name1', 'name2', 'name3']; 

var arrNames = arr1.map(function(nm){ return { name: nm }; });
这里有一个

同样,
map
不会修改所讨论的数组,这就是为什么在您的示例中arr1没有更改。它只是将数组映射到一个新数组,并返回该数组

如果要更改有问题的阵列,需要执行以下操作:

var arr1 = ['name1', 'name2', 'name3'];
arr1 = arr1.map(function(nm){ return { name: nm }; });

var arr2 ....
var arr1 = mapThis(['name1', 'name2', 'name3']);
var arr2 = mapThis(...
//and so on

function mapThis(arr){
    return arr.map(function(nm){ return { name: nm }; });
}
然后要使bigArray包含对arr1、arr2和arr3的引用,您只需在正确定义这些数组后创建包含对这些数组的引用的bigArray

var bigArray = [arr1, arr2, arr3]

最后编辑

如果您真的只想保存一些关键点笔划,可以执行以下操作:

var arr1 = ['name1', 'name2', 'name3'];
arr1 = arr1.map(function(nm){ return { name: nm }; });

var arr2 ....
var arr1 = mapThis(['name1', 'name2', 'name3']);
var arr2 = mapThis(...
//and so on

function mapThis(arr){
    return arr.map(function(nm){ return { name: nm }; });
}

这将从一开始就正确创建所有arrX数组,而不需要太多额外的按键

无地图的解决方案。它将在所有浏览器中工作

var arr1 = ['name1', 'name2', 'name3'];
var arr2 = [], i;

while(i = arr1.shift()) {
    arr2.push({"name": i});
}
arr1 = arr2;

根据MDN()上的文档,map函数
创建了一个新数组,其中包含对该数组中的每个元素调用提供函数的结果。
您不能单独使用
map()
对原始数组进行操作,因此您需要分配
map()的结果
arr1
或其他数组,并在需要更改的位置使用该数组

您可以这样做,而无需
map()
来推送大量数组:

var bigArray = [arr1, arr2, arr3];
var bigArrayFinal = [];
var nextArray;
while(nextArray = bigArray.slice()) {
  var thisArray = [];
  var nextElement;
  while(nextElement = bigArray.slice()) {
    thisArray.push({"name": nextElement});
  }
  bigArrayFinal.push(thisArray);
}

我已经在使用map方法修改
arr1
arr2
。。但是如果我有20个这样的数组呢。我不想单独修改每个数组。因此
bigArray
我知道map不会修改
arr1
,这就是为什么您在
forEach
中看到我正在修改
bigArray
。请阅读我的评论code@lovesh-见我的编辑。arr1未更改的原因是因为map未更改基础array@lovesh-使用map将arr1设置为任意值,然后从中创建bigArray。请阅读我问题中的编辑部分。那可能会澄清我的意图你说的推荐信是什么意思?你想要它,所以如果你在bigArray中更改了某些内容,它会更改原始内容?@epascarello完全正确。是的,不会发生这种情况,因为映射正在生成一个新的副本,并且无法链接它们。只需处理索引,它就会工作,@Yoshi谢谢。这是可行的,但我认为索引没有问题。我猜测的原因是,我将bigArray作为第三个参数传递给forEach,该参数作为值传递,并且我修改了bigArray的副本,因此更改没有反映在arr1、arr2中。但是非常感谢。把它写下来作为答案,这样我就可以把它标记为已接受