如何在JavaScript中更改数组中某些元素的数据类型

如何在JavaScript中更改数组中某些元素的数据类型,javascript,arrays,Javascript,Arrays,我想更改(嵌套)数组中某些元素的类型,我知道的唯一方法是运行for循环 请参见下面的示例: 数据的格式如下所示 var chartdata = [ ["1980/01/23", 95, 100, 98, 110], ["1980/01/24", 98, 98, 102, 103], ["1980/01/25", 90, 102, 95, 105], ["1980/01/26", 93, 95, 103, 103], ["1980/01/27", 94, 103, 104, 1

我想更改(嵌套)数组中某些元素的类型,我知道的唯一方法是运行for循环

请参见下面的示例:

数据的格式如下所示

var chartdata = [
  ["1980/01/23", 95, 100, 98, 110],
  ["1980/01/24", 98, 98, 102, 103],
  ["1980/01/25", 90, 102, 95, 105],
  ["1980/01/26", 93, 95, 103, 103],
  ["1980/01/27", 94, 103, 104, 105],
];
我想换成

var new_data = [
  [new Date("1980/01/23"), 95, 100, 98, 110],
  [new Date("1980/01/24"), 98, 98, 102, 103],
  [new Date("1980/01/25"), 90, 102, 95, 105],
  [new Date("1980/01/26"), 93, 95, 103, 103],
  [new Date("1980/01/27"), 94, 103, 104, 105],
];
我想出的唯一办法是一个for循环

function transform(arr) {
  var new_arr = [];

  for (var i = 0; i < arr.length; i++) {
    var sub_arr = [];
    for (var j = 0; j < arr[i].length; j++) {
      if (j == 0) {
        sub_arr.push(new Date(arr[i][j]));
      } else {
        sub_arr.push(arr[i][j]);
      }
    }
    new_arr.push(sub_arr);
  }
  return new_arr
}
alert(transform(chartdata));
函数变换(arr){ var new_arr=[]; 对于(变量i=0;i
有更好的方法来实现这一点吗?

使用
.map
将一个数组转换为另一个数组:

常量图表数据=[
["1980/01/23", 95, 100, 98, 110],
["1980/01/24", 98, 98, 102, 103],
["1980/01/25", 90, 102, 95, 105],
["1980/01/26", 93, 95, 103, 103],
["1980/01/27", 94, 103, 104, 105],
];
const newData=chartdata.map([dateStr,…rest])=>[newdate(dateStr,…rest]);

console.log(newData)事实上是的,您要多次复制每个内部数组的内容,使用
map
并指定新值将有效

这里有一个工作示例:

var chartdata=[
["1980/01/23", 95, 100, 98, 110],
["1980/01/24", 98, 98, 102, 103],
["1980/01/25", 90, 102, 95, 105],
["1980/01/26", 93, 95, 103, 103],
["1980/01/27", 94, 103, 104, 105],
];
函数变换(arr){
var new_arr=[];
对于(变量i=0;i{
第[0]项=新日期(第[0]项);
退货项目;
})
}
console.log(转换(图表数据));
console.log(“----”);
日志(改进的转换(图表数据))您可以使用
map()
从现有数组创建新数组:

var chartdata=[
["1980/01/23", 95, 100, 98, 110],
["1980/01/24", 98, 98, 102, 103],
["1980/01/25", 90, 102, 95, 105],
["1980/01/26", 93, 95, 103, 103],
["1980/01/27", 94, 103, 104, 105],
];
var new_data=chartdata.map(函数(i){
var日期=新日期(i[0]);
date=[date].concat(i.slice(1));
返回日期;
})

console.log(新的_数据)确定您可以简单地执行以下操作:

const chartdata = [
  ["1980/01/23", 95, 100, 98, 110],
  ["1980/01/24", 98, 98, 102, 103],
  ["1980/01/25", 90, 102, 95, 105],
  ["1980/01/26", 93, 95, 103, 103],
  ["1980/01/27", 94, 103, 104, 105],
];

const newData = chartdata.map(arr => {
  arr[0] = new Date(arr[0]);
  return arr;
});

console.log(newData);
如果不想改变原始数组,请执行以下操作:

const newData = chartdata.map(([...arr]) => {
    arr[0] = new Date(arr[0]);
    return arr;
});
您也可以使用param destruction在一行中执行此操作,如下所示:

const newData = chartdata.map(([date, ...rArr]) => [new Date(date), ...rArr]);

定义“更好”。@Crazy Train,为不准确的词道歉。我将使用“高效”或“更快”的方式。您在下面收到的答案不一定以绩效为主要目标。至于什么是最快的,只有性能测试会告诉您,并且在不同的实现中会有所不同将给出另一个嵌套数组<代码>返回[].concat(日期,arr.slice(1))
这会修改原始数组。将
console.log(chartdata)
放在末尾,您将看到。这将改变原始数组。您最好使用
forEach
而不是在第一个示例中,我假设op只关心新数据。如果你不想改变,你可以简单地做
[…chartdata].map(…
。你的“不想改变原始”代码仍然在改变原始数组。呃,这就是为什么你(我)应该总是测试你(我)的代码的原因。很好!答案更新了。