繁体   English   中英

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

[英]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”已经有相同的“名称”object,则将数据推送到“名称”object。

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM