从拆分到命名对象中破坏字符串

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)


另一种选择是使用 matchAllObject.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个结果