从拆分到命名对象中破坏字符串
Destruct a string from split to named object
我正在研究如何使用 destruct
一次性创建命名对象
搜索 javascript destruct* split object 没有揭示如何使用拆分将字符串直接分解为对象。
我指的不是 reduce 或 map,而是纯粹的破坏
const list = { ..... } = `......`.split(..)
或至少
const rowItem = { ..... } = `......`.split(..)
我的初始版本有效,但应该有更简洁的方法,步骤更少
最初的分割线很好。就是用destruct填充列表我很好奇
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`.split("\n")
let list = {}
rows.forEach(row => {
const [ProductId, Description, subCat, ] = row.split("|")
list[ProductId] = {"Description": Description, "subCat": subCat }
})
console.log(list)
你可以用 IIFE 做这样的事情
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`.split("\n")
let list = {}
rows.forEach(row => {
(([ProductId, Description, subCat]) => (list[ProductId] = {
Description,
subCat
}))(row.split("|"))
})
console.log(list)
如果您的环境可用,您可以考虑使用 Object.fromEntries
const rows = Object.fromEntries(`100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`
.split("\n")
.map(row => row.split('|'))
.map(([key, Description, subCat]) => [key, { Description, subCat }])
);
console.log(rows);
可以在解构时将 属性 设置为现有对象。
const row = { Description: 'Description 1', subCat: 'a' },
o = { }; // existing object to be updated;
({ Description: o.Description, subCat: o.subCat } = row);
console.log(o)
在你的例子中,你有动态的 id
键,嵌套的 属性 更新,你正在解构一个数组而不是一个对象。它变得很复杂,但是 可以将上述逻辑应用到您的代码中 (这非常骇人听闻且纯粹是学术性的。这 永远不会 在实际代码库中使用)
const str = "100|Description 1|a|",
splits = str.split('|'),
list = {};// existing object
({ 0: id, [-1]: list[id]= {}, 1: list[id].Description, 2: list[id].subCat } = splits)
console.log(list)
这会像对象一样解构数组。它使用键 0
获取 属性 并将其设置为 id
变量。然后解构-1
属性。这是不存在的,因此使用 default value 并设置 list[id] = {}
。
转译后的代码如下所示:
var _str$split = str.split('|');
id = _str$split[0];
list[id] = _str$split[-1] === undefined ? {} : _str$split[-1];
list[id].Description = _str$split[1];
list[id].subCat = _str$split[2];
console.log(list);
将此应用于您的原始代码段:
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`
let list = {},
id;
rows.split("\n")
.forEach(str => ({
0: id,
[-1]: list[id] = {},
1: list[id].Description,
2: list[id].subCat
} = str.split('|'))
)
console.log(list)
另一种选择是使用 matchAll
和 Object.fromEntries()
const str = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`;
const regex = /(\d+)\|([^|]+)\|(\w+)/g;
const output = Object.fromEntries(
Array.from(
str.matchAll(regex), ([, id, Description, subCat]) => [id, { Description, subCat }]
)
)
console.log(output)
matchAll
还在Draft stage but it is implemented except by IE and Safari. You can easily polyfill it. It is basically looping through exec
个结果
我正在研究如何使用 destruct
一次性创建命名对象搜索 javascript destruct* split object 没有揭示如何使用拆分将字符串直接分解为对象。
我指的不是 reduce 或 map,而是纯粹的破坏
const list = { ..... } = `......`.split(..)
或至少
const rowItem = { ..... } = `......`.split(..)
我的初始版本有效,但应该有更简洁的方法,步骤更少
最初的分割线很好。就是用destruct填充列表我很好奇
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`.split("\n")
let list = {}
rows.forEach(row => {
const [ProductId, Description, subCat, ] = row.split("|")
list[ProductId] = {"Description": Description, "subCat": subCat }
})
console.log(list)
你可以用 IIFE 做这样的事情
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`.split("\n")
let list = {}
rows.forEach(row => {
(([ProductId, Description, subCat]) => (list[ProductId] = {
Description,
subCat
}))(row.split("|"))
})
console.log(list)
如果您的环境可用,您可以考虑使用 Object.fromEntries
const rows = Object.fromEntries(`100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`
.split("\n")
.map(row => row.split('|'))
.map(([key, Description, subCat]) => [key, { Description, subCat }])
);
console.log(rows);
可以在解构时将 属性 设置为现有对象。
const row = { Description: 'Description 1', subCat: 'a' },
o = { }; // existing object to be updated;
({ Description: o.Description, subCat: o.subCat } = row);
console.log(o)
在你的例子中,你有动态的 id
键,嵌套的 属性 更新,你正在解构一个数组而不是一个对象。它变得很复杂,但是 可以将上述逻辑应用到您的代码中 (这非常骇人听闻且纯粹是学术性的。这 永远不会 在实际代码库中使用)
const str = "100|Description 1|a|",
splits = str.split('|'),
list = {};// existing object
({ 0: id, [-1]: list[id]= {}, 1: list[id].Description, 2: list[id].subCat } = splits)
console.log(list)
这会像对象一样解构数组。它使用键 0
获取 属性 并将其设置为 id
变量。然后解构-1
属性。这是不存在的,因此使用 default value 并设置 list[id] = {}
。
转译后的代码如下所示:
var _str$split = str.split('|');
id = _str$split[0];
list[id] = _str$split[-1] === undefined ? {} : _str$split[-1];
list[id].Description = _str$split[1];
list[id].subCat = _str$split[2];
console.log(list);
将此应用于您的原始代码段:
const rows = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`
let list = {},
id;
rows.split("\n")
.forEach(str => ({
0: id,
[-1]: list[id] = {},
1: list[id].Description,
2: list[id].subCat
} = str.split('|'))
)
console.log(list)
另一种选择是使用 matchAll
和 Object.fromEntries()
const str = `100|Description 1|a|
101|Description 2|a|
102|Description 3|b|`;
const regex = /(\d+)\|([^|]+)\|(\w+)/g;
const output = Object.fromEntries(
Array.from(
str.matchAll(regex), ([, id, Description, subCat]) => [id, { Description, subCat }]
)
)
console.log(output)
matchAll
还在Draft stage but it is implemented except by IE and Safari. You can easily polyfill it. It is basically looping through exec
个结果