如何从字符串中创建具有数组属性的对象?

How to create an object with properties in the array from the string?

我想通过字符串在数组中创建具有属性的对象。我正在从不带圆括号的字符串和“数据”中提取“名称”,并尝试使用 属性 “名称”在数组中创建对象 和 属性“数据”。但实际结果与预期不同,请帮忙解决

const names = ["name1 /2 (data1)", "name1 /2 (data2)", "name2 /1 (data1)"]
const flag = true

names.forEach(name => {
    console.log(getStructuredDataFromNames(name))
})

function getStructuredDataFromNames(name) {
    const names = {}
    // extract name from string and conver to valid format - 'name1'
    const formattedName = name.substr(0, name.indexOf("/")).replace(/\s+/g, "")
    // extract data from string and conver to valid format - 'data1'
    const formattedData = name.match(/\((.*)\)/).pop()

    const reference = {
        formattedData,
        flag
    }
    // if no name then create a new property by this name
    if (!names[name]) {
        names[name] = [{
            data: [reference]
        }]
    } else {
        // if object have name but name have more then 1 data then push this data to array
        names[name].push(reference)
    }
    const result = Object.keys(names)
    return result.map(el => ({
        name: el,
        data: names[el]
    }))
}

预期结果

[{
        name: "name1",
        data: [{
                flag: true,
                formattedData: "data1"
            },
            {
                flag: true,
                formattedData: "data2"
            }
        ]
    },
    {
        name: "name2",
        data: [{
            flag: true,
            formattedData: "data1"
        }]
    }
]

虽然代码不是那么干净,但可以胜任。 我的流程是先去掉空格,然后拆分名称和数据,去掉数​​据前的数字和remove()。如果“formattedNames”已经有相同的“name”对象,则将数据推送到“name”对象。

const names = ["name1 /2 (data1)", "name1 /2 (data2)", "name2 /1 (data1)"]
const formattedNames = []

names.forEach(value =>{
  const processedName = value.replace(/ /g,'').split("/")
  const formattedName = formattedNames.find((object)=>{ return object.name === processedName[0]})
  const formattedData = processedName[1].split("(")[1].replace(")","")
  if (!formattedName) {
    formattedNames.push({name: processedName[0],data: [{flag: true, formattedData}]})
  } else {
    formattedName.data.push({flag: true, formattedData})
  }
})

console.log(formattedNames)

这是一个非常低效的方法

var names2 = ["name1 /2 (data1)", "name1 /2 (data2)", "name2 /1 (data1)"]
var flag2 = true

var result2 = names2.map(x =>
{
  return {
    name: x.split(" ")[0],
    data:
    [
      {
        flag: flag2,
        formattedData: x.match(/\((.*)\)/).pop()
      }
    ]
  }
})

result2.forEach((el, index, arr) =>
{
  let el2 = arr.filter(x => x.name == el.name)[0];
  
  if(el2 == el)
    return;
  
  el2.data = el2.data.concat(el.data);
  
  delete arr[index];
})

result2 = result2.filter(x => true);

console.log(result2);