对于数组[1,2, 3, 5, 6, 8, 10.11,12],数字连续用- 表示,转成[1-3,5-6,8,10-12] ?
js把以下数据转成树形结构?
var obj=[
(id3, parent:2).
(id:1, parent:null).
{id:2, parent:1}.
]
怎么把<div> <p> {$no}</p> <p> {title}</p> </div>中的$no改成5 ,$title 改成jack ?
对于数组[1,2, 3, 5, 6, 8, 10.11,12],数字连续用- 表示,转成[1-3,5-6,8,10-12] ?
js把以下数据转成树形结构?
var obj=[
(id3, parent:2).
(id:1, parent:null).
{id:2, parent:1}.
]
怎么把<div> <p> {$no}</p> <p> {title}</p> </div>中的$no改成5 ,$title 改成jack ?
下面是用reducer处理。你也可以不用它,设定一个辅助游标,找到连续的起点索引,用循环+ slice
达到同样的目的。
function reducer (acc, v, i,arr) {
// 1.过滤所有连续数(用或运算考虑临界情况)
if ((arr[i + 1] - arr[i] == 1) || (arr[i] - arr[i - 1] == 1) ) {
// 2.创建二维数组元素
if (arr[i] - arr[i - 1] != 1) {
acc.push([])
}
acc[acc.length - 1].push(v)
} else {
// 3.加入不连续数
acc.push(v)
}
return acc
}
测试如下
var aList = [1,2, 3, 5, 6, 8, 10,11,12]
var str = aList.reduce(reducer,[]).map(v => Array.isArray(v) ? v.join('-') : v)
console.log(aList)
consolog.log(str)
输出
[ 1, 2, 3, 5, 6, 8, 10, 11, 12 ]
[ '1-2-3', '5-6', 8, '10-11-12' ]
第三题解
str = "<div> <p> {$no}</p> <p> {$title}</p> </div>"
// 1. 创建正则实例
var re = /(?<=\{)(\$\w+)(?=\})/g
// 2. 构建替换对象
var o = {'no':5, 'title':'jack'}
// 3. 替换
var res = str.replace(re, m => o[m.substr(1)])
console.log(str)
console.log(res)
输出
<div> <p> {$no}</p> <p> {$title}</p> </div>
<div> <p> {5}</p> <p> {jack}</p> </div>
第一道题的解法,
function arr2Bar (arr) {
let result = [], i = 0
result[i] = [arr[0]] // 二维数组初值resutl[0][0] = [arr[0]]
arr.reduce((prev, cur) => {
// 如果连续,把元素放在二维数组里面;不连续,二维数组长度递增一个,把新的数组放在新的递增数组内
cur - prev === 1 ? result[i].push(cur) : result[++i] = [cur]
return cur
})
return result.map(item => {
// 二维数组转成一维数组
if (item.length > 1) { return item[0] + '-' + item[item.length -1] }
return item[0]
})
}
const res = arr2Bar([1, 2, 3, 5, 6, 8, 10, 11, 12])
console.log(res)
第二道题数据不齐,没做,不过你看第一位大佬的文章,看懂的话,应该不难
第三道题
const str = '<div><p>{$no}</p><p>{title}</p></div>'
const reg = /\{([^}]+)\}/g // 取消正则的懒惰性在正则最后加上g,这是正则会自动保存一个lastIndex,下次从此处开始
const data = {
no: 5,
title: 'jack'
}
const newStr = str.replace(reg, ($1,res) => {
if (res.indexOf('$') > -1) { res = res.trim().substring(1) } // 去掉$
for(const d in data) {
if (res == d) return data[d] // 如果data里面有值就把值给新的字符串
}
})
console.log(newStr)
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
6 回答2.4k 阅读
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
1.遍历数组进行分组,如果当前元素与前面不连续则新分一组,最后把每组元素用-连接起来。
2.转树结构写过一篇文章,你可以在这里找到答案:http://wintc.top/article/20
3. 正则或者简单的replace.
都不复杂就留给你自己思考代码实现了~