1. 程式人生 > >陣列亂序、多行省略號、mongoose-update

陣列亂序、多行省略號、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'
      });
    }
  })

MongoDB 原子操作

 

序列化

將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。可序列化的物件在安全上需要注意。