我想打破这个字符串:
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中发布的问题找不到类似的东西。
答案 0 :(得分:2)
这需要做很多事情:
这是我的看法,使用chunk
中的objectFromPairs
和30secondsofcode(免责声明:我是项目/网站的维护者),以及众多{{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)
这假设数据是干净的。如果可能会有多余的非数据行,那么您需要做更多的工作,但是我认为基本思想仍然可以解决。