我有几个像这样的数组
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
};
});
});
正如您在forEach
上执行bigArray
时看到的那样,我通过地图修改了每个数组(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
,...所以我不想去为每个这些单独应用地图所以我把它们放在我身上名为bigArray
的大数组并在其上执行forEach
答案 0 :(得分:2)
map方法就是你想要的;这会创建一个新数组,这就是您看到结果的原因。
var arr1 = ['name1', 'name2', 'name3'];
var arrNames = arr1.map(function(nm){ return { name: nm }; });
这是DEMO
同样,map
不会修改有问题的数组,这就是为什么在您的示例中未更改arr1的原因。它只是将数组映射到一个新数组,然后返回它。
如果您想更改相关数组,您需要执行以下操作:
var arr1 = ['name1', 'name2', 'name3'];
arr1 = arr1.map(function(nm){ return { name: nm }; });
var arr2 ....
然后让bigArray包含对arr1,arr2和arr3的引用,你只需创建bigArray,其中包含对这些数组的引用,经过正确定义。
var bigArray = [arr1, arr2, arr3]
上次修改
如果你真的只想保存一些击键,你可以这样做:
var arr1 = mapThis(['name1', 'name2', 'name3']);
var arr2 = mapThis(...
//and so on
function mapThis(arr){
return arr.map(function(nm){ return { name: nm }; });
}
这将从一开始就正确地创建所有的arrX数组,而不会有太多额外的击键。
答案 1 :(得分:0)
没有地图的解决方案。它适用于所有浏览器。
var arr1 = ['name1', 'name2', 'name3'];
var arr2 = [], i;
while(i = arr1.shift()) {
arr2.push({"name": i});
}
arr1 = arr2;
答案 2 :(得分:0)
根据MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)的文档,地图函数Creates a new array with the results of calling a provided function on every element in this array.
您无法使用map()
本身对原始数组进行操作,因此您需要指定{的结果{1}}到map()
或其他数组,并使用您需要进行更改的数组。
你可以做这样的事情,没有arr1
推送大量数组:
map()