数组乱序、多行省略号、mongoose-update
1、数组乱序
function shuffle(arr){ var len = arr.length, temp; for(var i=0,rand;i<len;i++){ rand = i + ~~(Math.random()*(len - i)); temp = arr[i]; arr[i] = arr[rand]; arr[rand] = temp; } return arr; } console.log(shuffle([5,4,0,1,2,7]));
由于使用sort加Math.random()*0.5实现的排序乱序有很大机会在同一个位置出现的几率比较高,而且每个位置的几率都不平均。
而以上的实现可以证实比较优的方法。
数学归纳法:
证明: i/(i+1)*(i-1/i)...2/3*1/2 = 1/(i+1)
1、n=2时,替换几率为1/2,不替换为1/2.
2、n=i,i>2时,每个位置替换与不替换的几率为1/i.
3、n=i+1,i+1>2时,每个位置替换与不替换的几率为1/(i+1),而假设每个与最后一个替换的概率为1/(i+1),那么最后一个与每个不替换的概率就是
i/(i+1),那么循环每一个与最后一位替换,第一次的不替换为i/(i+1),第二次就为i,而且根据2假设,每一个位置不替换为1/i,那么循环i次为 i/(i+1)*1/i=1/(i+1)
2、多行省略号
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> .mutil-line-ellipsis { width: 400px; height: 50px; line-height: 25px; margin: 20px 20px 50px 300px; border: 5px solid #AAA; line-height: 25px; overflow: hidden; } /*相当于之前的prop*/ .mutil-line-ellipsis:before { content: ''; float: left; width: 5px;/*缩小宽度为5px,其余属性不变*/ height: 50px; } /*相当于之前的main*/ .mutil-line-ellipsis > :first-child { float: right; width: 100%; margin-left: -5px;/*让main元素左移5px,这样main元素在宽度上就完全占满了父元素;*/ word-break: break-all; } /*相当于之前的realEnd*/ .mutil-line-ellipsis:after { content: '...'; box-sizing: content-box; float: right; position: relative; width: 50px; height: 25px; top: -25px; /*等于高度的负值,就是文字的行高*/ left: 100%; /*而设置margin-left: -50px、padding-right: 5px则是为了让realend元素的盒模型的最终宽度计算为5px。*/ margin-left: -50px; padding-right: 5px; font-size: 13px; text-align: right; background: linear-gradient(to right, rgba(255, 255, 255, 0), #ffffff 40px); } </style> </head> <body> <div class="mutil-line-ellipsis"> <div> 2.main 这里是要多行文本溢出省略的,内容多一点,内容多一点,内容多一点,内容多一点 内容多一点,内容多一点,内容多一点,内容多一点,内容多一点,内容多一点 </div> </div> </body> </html>
巧妙使用了relative、margin-left、float,首先使用before挤出5px,然后margin-left:-5px占回去,而且width:100%,那么右边就会出现一点点空间让after占着当内容溢出时,而...为英文默认不换行,那么
就实现了内容溢出出现省略号了。
当然里面还有很多有意思的样式。
3、mongoose-update
更新子文档内容,
如以下,由于cartList为数组结构,所以cartList.$.productNum更新到具体某个位置的值,而$为占位符,代表某一行数据下的productNum数据更新
参数:
条件 «Object»
更新内容 «Object»
[操作参数] «Object» 参考https://mongoosejs.com/docs/api.html#query_Query-setOptions
[回调] «Function»
例子:
User.update({"userId":userId,"cartList.productId":productId},{
"cartList.$.productNum":productNum,
"cartList.$.checked":checked,
}, function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result:'suc'
});
}
})
删除某一条信息,使用update与原子操作$pull实现,先查询到然后删除符合条件的子文档
$pull删除符合条件的内容
User.update({
userId:userId
},{
$pull:{
'cartList':{
'productId':productId
}
}
}, function (err,doc) {
if(err){
res.json({
status:'1',
msg:err.message,
result:''
});
}else{
res.json({
status:'0',
msg:'',
result:'suc'
});
}
})
序列化
将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。可序列化的对象在安全上需要注意。