将引号包围的数组数组转换为字符串数组
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', ... ]
对于完成的工作,我遵循了两种方式,
formattedArray1 = array1.replace(/","/g, " - ").reduce((a, b) => a.concat(b), [])
这给了我一个错误:
array2.reduce is not a function
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
- 你正在调用 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);
我有以下格式的日期持续时间值。
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', ... ]
对于完成的工作,我遵循了两种方式,
formattedArray1 = array1.replace(/","/g, " - ").reduce((a, b) => a.concat(b), [])
这给了我一个错误:
array2.reduce is not a function
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
- 你正在调用 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);