如何将字符串分解为对象数组

时间:2018-09-13 15:23:28

标签: javascript

我想打破这个字符串:

data=

1.

Title: The Definitive Guide
Copy: There’s no way around it, 
URL: http://www.schools
Date: 6/7/17

2.

Title: Using 
Copy: Today’s fast
URL: https://blog
Date: 6/16/17
3.

Title: 4 Ways 
Copy: Let’s state
URL: https://www.
Date: 6/20/17
在这种情况下,将

放入一个length = 3的数组中(上面每个编号一个)。每个数组项都应该是一个对象,其属性为:标题,副本,URL,日期。

我已经尝试过了:

for(let i=0; i<3; i++) {

    arr[i] =temp.split(i+2 + ".");
    temp=temp.slice(0, arr[i].length);


};

也许甚至还有一个更简单的字符串方法。过去在SO中发布的问题找不到类似的东西。

2 个答案:

答案 0 :(得分:2)

这需要做很多事情:

  • 分成几行
  • 过滤掉无意义的行
  • 4人一组的大块
  • 从每个组创建一个对象

这是我的看法,使用chunk中的objectFromPairs30secondsofcode(免责声明:我是项目/网站的维护者),以及众多{{3 }}方法:

var data = `

1.

Title: The Definitive Guide
Copy: There’s no way around it, 
URL: http://www.schools
Date: 6/7/17

2.

Title: Using 
Copy: Today’s fast
URL: https://blog
Date: 6/16/17
3.

Title: 4 Ways 
Copy: Let’s state
URL: https://www.
Date: 6/20/17
`;

const chunk = (arr, size) =>
  Array.from({
      length: Math.ceil(arr.length / size)
    }, (v, i) =>
    arr.slice(i * size, i * size + size)
  );

const objectFromPairs = arr => arr.reduce((a, [key, val]) => ((a[key] = val), a), {});


const dataArr = chunk(
  data.trim().split('\n')
  .filter(v => v.trim().indexOf(':') !== -1)
  .map(x => {
    let t = x.split(':');
    return [t[0], t.slice(1).join(':')].map(v => v.trim())
  }), 4
 ).map(o => objectFromPairs(o));
console.log(dataArr);

答案 1 :(得分:2)

我选择简单地逐行阅读。您的行将是数字和点,空格或数据。无需复杂的正则表达式就可以轻松遍历整个循环:

data=`

1.

Title: The Definitive Guide
Copy: There’s no way around it, 
URL: http://www.schools
Date: 6/7/17

2.

Title: Using 
Copy: Today’s fast
URL: https://blog
Date: 6/16/17
31.

Title: 4 Ways 
Copy: Let’s state
URL: https://www.
Date: 6/20/17
`
let current, final = []
data.split('\n').forEach(line => {
  if (/^\d+\./.test(line)) final.push(current = {}) // new block
  else if (/\S/.test(line)){                        // some data
    let split = line.indexOf(":")
    let key = line.slice(0, split)
    let val = line.slice(split +1)
    current[key] = val.trim()
  }
})
console.log(final)

这假设数据是干净的。如果可能会有多余的非数据行,那么您需要做更多的工作,但是我认为基本思想仍然可以解决。