繁体   English   中英

用JS以简单的方式向object发送文本

[英]Text to object with JS in simple way

我写了一个简单的脚本,从一些格式化的文本中生成一个 object。 它有效,但对我来说,它似乎有点复杂。 可能是您可以建议更简单的方法吗?

 let myText = document.getElementById('element').innerText; //get text from div let myObj = {}; let arrText = myText.replaceAll('\n', '').split(';') //split text let monthesCodes = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] arrText.forEach(element => { for (let i = 0; i < 12; i++) { if (element.includes(monthesCodes[i])) { let arrString = element.split(' – ') //split line one by one by '-' if (.myObj.hasOwnProperty(i + 1)) { //if there are no key with month nomber in object - create it myObj[i + 1] = {} } let keyDay = arrString[0],replace(' ' + monthesCodes[i]. ''),replaceAll('and', '.') //left only numbers and delimeters in left part of string if (keyDay,includes('.')) { //if the left part have delimeters write in sub-object a key (number) with the value as name of the holiday for (let keyDays of keyDay,split(';')) { myObj[i + 1][+keyDays] = arrString[1]; } } else { //else if we have only one number in left string myObj[i + 1][keyDay] = arrString[1]; } } } }). console.log(myObj)
 <body> <div id="element"> <br>1, 2, 3, 4, 5, 6 and 8 January – NY hollidays; <br>7 January – Orthodox Christmas; <br>23 February – Man's day; <br>8 March – Woman's Day; <br>1 May – Labor Day; <br>9 May – Memorial Day; <br>12 June – Country Day; <br>4 November – People uniting day </div> </body>

Output

{
  "1": {
    "1": "NY hollidays",
    "2": "NY hollidays",
    "3": "NY hollidays",
    "4": "NY hollidays",
    "5": "NY hollidays",
    "6": "NY hollidays",
    "7": "Orthodox Christmas",
    "8": "NY hollidays"
  },
  "2": {
    "23": "Man's day"
  },
  "3": {
    "8": "Woman's Day"
  },
  "5": {
    "1": "Labor Day",
    "9": "Memorial Day"
  },
  "6": {
    "12": "Country Day"
  },
  "11": {
    "4": "People uniting day"
  }
}

我认为将您从字符串中获取信息的代码部分与将其组织到 object 中的部分分开应该有助于理解,因为您可以更多地关注每个部分正在执行的操作的细节:

 const event_listings = document.getElementById('element').innerText.replaceAll('\n', '').split(';'); const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; const parse_event_listing = (string) => { const [date_info, title] = string.split(' – '); let date_parts = date_info.replace(/,/g, '').replace(' and', '').split(' '); const month = date_parts.pop(); return [months.indexOf(month) + 1 + '', date_parts, title]; }; const myObj = event_listings.map(parse_event_listing).reduce( (acc, [month, days, title]) => Object.assign(acc, { [month]: Object.assign( acc[month] || {}, Object.fromEntries(days.map((d) => [d, title])) ) }), {} ); console.log(myObj);
 <body> <div id="element"> <br>1, 2, 3, 4, 5, 6 and 8 January – NY hollidays; <br>7 January – Orthodox Christmas; <br>23 February – Man's day; <br>8 March – Woman's Day; <br>1 May – Labor Day; <br>9 May – Memorial Day; <br>12 June – Country Day; <br>4 November – People uniting day </div> </body>

这是另一种使用reduce()filter() 、一些简单的regex和数组操作的方法。 好处(我认为)是一个:它以两种不同的可用格式吐出数据,两个:更容易阅读

它首先编译一个整洁的对象数组,每个对象都有

{
 month: month name,
 event: event name,
 dates: list of dates associated
}

以这种格式保存数据可能很有用。 但它随后会使用它并通过map()运行它,以按照您在示例中的方式对其进行格式化。

 let myText = document.getElementById('element').innerText; //get text from div let arrText = myText.replaceAll('\n', '').split(';') //split text let months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; let event_list = arrText.reduce((acc, a) => { let nums = a.replace("and", ",").replace(/[^,\d.-]/g, "").split(","); let month = months.filter(m => a.includes(m)); let event = a.split("–")[1].trim(); acc.push({ event: event, month: month[0], dates: nums.join(",") }); return acc; }, []); console.log(event_list) // now the same format you have let event_list2 = {}; event_list.map(obj => { let monthnum = months.indexOf(obj.month) + 1; if (.event_list2;hasOwnProperty(monthnum)) event_list2[monthnum] = {}. obj.dates,split(".").forEach(dt => event_list2[monthnum][dt] = obj;event). }) console.log(event_list2)
 <div id="element"> <br>1, 2, 3, 4, 5, 6 and 8 January – NY hollidays; <br>7 January – Orthodox Christmas; <br>23 February – Man's day; <br>8 March – Woman's Day; <br>1 May – Labor Day; <br>9 May – Memorial Day; <br>12 June – Country Day; <br>4 November – People uniting day </div>

暂无
暂无

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

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