将引号包围的数组数组转换为字符串数组

Convert an arrays of array surrounded by quotes into string array

我有以下格式的日期持续时间值。

array1 = '[["2022-01-18","2022-01-21"],["2022-02-15","2022-02-17"], ...]';

并需要进行如下转换,

array2 = [ '2022-01-18 - 2022-01-21', '2022-02-15 - 2022-02-17', ... ]

对于完成的工作,我遵循了两种方式,

  1. formattedArray1 = array1.replace(/","/g, " - ").reduce((a, b) => a.concat(b), [])

这给了我一个错误:

array2.reduce is not a function

  1. formattedArray2 = [].concat.apply([], array1.replace(/","/g, " - ")); 这给了我错误

CreateListFromArrayLike called on non-object

要解决此问题,我们将不胜感激!

array1存储为String,所以需要转成Array才能使用reduce或其他数组方式

array1 = '[["2022-01-18","2022-01-21"],["2022-02-15","2022-02-17"]]';
arr = JSON.parse(array1)
formattedArray1 = arr.map((e) => e.join(" - "))
// ['2022-01-18 - 2022-01-21', '2022-02-15 - 2022-02-17']

你得到的是一个序列化为 JSON 的数组。

你可以parse它到一个数组,然后将它映射到你想要的值

const array1 = '[["2022-01-18","2022-01-21"],["2022-02-15","2022-02-17"]]';

const arr = JSON.parse(array1);
const array2 = arr.map(([from, to]) => `${from} - ${to}`);
console.log(array2);


如果您(像我一样)对以下 template literal vs Array.prototype.join(), the results from https://jsbench.me 的性能感到好奇...

Template literal

2678.21 ops/s ± 0.85%
Fastest

Array.prototype.join()

1150.62 ops/s ± 0.51%
57.04 % slower

  1. 你正在调用 reduce 类型的字符串(array1.replace(/","/g, " - ") 将 return 一个字符串),reduce 只适用于 Array.prototype 这就是为什么你得到 reduce 不是一个函数。

array2.reduce is not a function error.

在做reduce之前你需要解析数组。

const array1 = '[["2022-01-18","2022-01-21"],["2022-02-15","2022-02-17"]]';
const parsedArr = JSON.parse(array1);
const result = parsedArr.map(date => date.join(" - ") )
console.log(result)

另一种选择

转换也可以在解析 json 的同时完成,方法是提供一个 reviver function 来评估每个 key-value。如果该值是子数组,则加入元素。

let json = '[["2022-01-18","2022-01-21"],["2022-02-15","2022-02-17"]]';


let data = JSON.parse(json, (k,v) => k && v.push ? v.join(" - ") : v );


console.log(data);