首页 > 解决方案 > 在某个字符后将数组中的每个元素拆分为对象

问题描述

我是 node.js 和 javascript 的新手。我有以下数组:

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\nname2\street2\tperson1\tphone82\tphone3\n'
]

请注意,这是一个单元素数组。首先,我要求数组首先在每个新行之后包含一个新元素,然后重新格式化,如下所示:

let headers = {
  name: "",
  street: "",
  person: "",
  phone 1 "",
  phone 2 ""
}

如何解析每个元素(在每个 + 之后创建一个新元素之后),并在每个实例之后在数组中分配一个对象\

所需的输出是这样的:

[{
  name: 'name1',
  street: 'street2',
  person: 'person1',
  phone1: 'phone82 ',
  phone2: 'phone3'
},
{
  name: 'name2',
  street: 'street2',
  person: 'person1',
  phone1: 'phone1 ',
  phone2: 'phone2'
}]

非常感谢任何帮助。

标签: javascriptnode.jsarraysfor-loop

解决方案


如果您的所有项目都具有相同的结构,OLD_ARRAY则可以使用map,filterreduce操作您的输入。

那我做了什么?

  1. 如果您有多个字符串,例如示例输入(超过 1 个数组项),我使用mapsplitby将其转换为每个字符串的子数组\n,这是您的字符串分隔符。比我用不为空的字符串过滤它(因为你也有一个后缀\n)。
  2. 从每个子数组中,我使用extractContacts函数提取了所有联系人 - 它通过您的 separaotr 拆分子数组\t,并根据您的联系人模板对其进行映射。
  3. 由于它是数组数组的格式,我使用 reduce 将所有数组连接在一起

const OLD_ARRAY = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
  'name2\tstreet2\tperson1\tphone82\tphone3\n'
];

function extractContacts(templates) {
  return templates.map(t => t.split('\t'))
    .map(details => ({
      name: details[0],
      street: details[1],
      person: details[2],
      phone1: details[3],
      phone2: details[4]
    }));
}

let contacts = OLD_ARRAY.map(str => str.split('\n').filter(str => str !== ''))
  .map(template => extractContacts(template))
  .reduce((a, acc) => acc.concat(a), []);

console.log(contacts)


推荐阅读