内循环遍历单位技巧

for(var a = 0; a < entitys.length; a++){
    for(var b = a + 1; b < entitys.length; b++){
        console.log(`${entitys[a].name}-${entitys[b].name} 
        distance:${entitys[a].GetDistance(entitys[b])}`);
    }
}

内循环并没有遍历所有的单位。它只是遍历了外循环还没有访问过的单位。这样就避免了对 每一对单位进行两次比较,正着比一次,反着再比一次。如果我们已经处理过了A和B之间的 碰撞,我们就不再需要再次检测B和A之间的碰撞了。

【算法】Knuth 洗牌算法

适用于打乱一串数组,同时也适用于在数组中随机抽取多个元素不重复

var knuth = (arr)=>{
    var swap = (ar, ia, ib)=>{
        var temp = ar[ia];
        ar[ia] = ar[ib];
        ar[ib] = temp;
    };
    var rand = (a,b)=>{
        return Math.ceil(a) + Math.floor(Math.random() * Math.floor(b-a));
    }
    for(var i = arr.length - 1; i >= 0 ; i -- )
        swap(arr,i, rand(0, i)) // rand(0, i) 生成 [0, i] 之间的随机整数
    return arr;
}
knuth(new Array(8).fill(0).map((item,index)=>index));

bootstrap Validator v0.5.1-dev 爆炸坑

参考
http://1000hz.github.io/bootstrap-validator/#
http://formvalidation.io/download/
http://blog.csdn.net/u013938465/article/details/53507109

神奇的变量命名

a:
b: 需验证字段
c: message容器/配置
d: 表单元素的type

默认字段

获取方式 $.fn.bootstrapValidator.DEFAULT_OPTIONS

{
    "elementClass": "bv-form",
    "message": "This value is not valid",
    "group": ".form-group",
    "container": null,
    "threshold": null,
    "excluded": [
        ":disabled",
        ":hidden",
        ":not(:visible)"
    ],
    "feedbackIcons": {
        "valid": null,
        "invalid": null,
        "validating": null
    },
    "submitButtons": "[type=\"submit\"]",
    "live": "enabled",
    "fields": null
}
fields={
    container 
    excluded
    feedbackIcons
    group
    message
    onError
    onStatus
    onSuccess
    selector
    threshold 开始验证长度(对radio类型无效)
    trigger     触发验证的动作例如:keyup(按键)/blur(失去焦点)
    validators
}

fields.validators = {

    callback:{
        message:[string],
        callback: [function]
    },

    notEmpty

    numeric: {
        message:[string],
        separator: [function]
    },



}

栗子

$("#agentCreate").bootstrapValidator({
        feedbackIcons:{
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        message:'不能为空',
        fields:{
            title:{
                validators: {
                    notEmpty: {}
                }
            },
            file:{
                validators: {
                    notEmpty: {}
                }
            },
        }
    }).on('success.form.bv', function(e) {
                // 阻止默认事件提交
                e.preventDefault();
            });
    $("#sub").on("click", function () {
        //获取表单对象
        var bootstrapValidator = $("#agentCreate").data('bootstrapValidator');
        //手动触发验证
        bootstrapValidator.validate();
        if (bootstrapValidator.isValid()) {
            console.log("bootstrapValidator", arguments);
            //表单提交的方法、比如ajax提交

        }
    })

操作

获取已配置的表单元素

$("#agentCreate").data("bootstrapValidator").getInvalidFields()

获取配置

$("#agentCreate").data("bootstrapValidator").getOptions()

重置某字段(会清空对应表单元素数据)

$("#agentCreate").data("bootstrapValidator").resetField("imgId","#imgSelector")

更新某字段状态(不会清空数据)

$(formName).data(“bootstrapValidator”).updateStatus("fieldName",  "NOT_VALIDATED",  null );

原生js 一次性函数

// 创建一个一次性事件
function onetime(node, type, callback) {

    // 创建事件
    node.addEventListener(type, function(e) {
        // 移除事件
        e.target.removeEventListener(e.type, arguments.callee);
        // 调用处理器
        return callback(e);
    });

}

js 真值表

nullundefinedfalse"false"Boolean(false)[][[]]""String("")0Number(0)"0"String("0")[0]true"true"Boolean(true)1Number(1)"1"String("1")[1]-1Number(-1)"-1"String("-1")[-1]Infinity-InfinityObject()NaNnullundefinedfalse"false"Boolean(false)[][[]]""String("")0Number(0)"0"String("0")[0]true"true"Boolean(true)1Number(1)"1"String("1")[1]-1Number(-1)"-1"String("-1")[-1]Infinity-InfinityObject()NaN=====>= && <=>=<=else

正则符号过滤 并添加反义符

// 正则符号前加反义符,避免正则符号导致匹配错误
function regular_encode (string){
  return string.replace( /[+\\*?.\[\]\{\}\|\(\)\<\=]/g, function(word){return "\\"+word} );
}
//应用
var string = "df+54d[dfdf]";
string.replace( /[+\\*?.\[\]\{\}\|\(\)\<\=]/g, function(word){return "\\"+word} )
//输出:"df\+54d\[dfdf\]"

js md5

来源:http://www.oschina.net/code/snippet_12_8927

/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/
  
var MD5 = function (string) {
  
    function RotateLeft(lValue, iShiftBits) {
        return (lValue<>>(32-iShiftBits));
    }
  
    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }
  
    function F(x,y,z) { return (x & y) | ((~x) & z); }
    function G(x,y,z) { return (x & z) | (y & (~z)); }
    function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }
  
    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };
  
    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };
  
    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };
  
    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };
  
    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<>>29;
        return lWordArray;
    };
  
    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };
  
    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";
  
        for (var n = 0; n < string.length; n++) {
  
            var c = string.charCodeAt(n);
  
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
  
        }
  
        return utftext;
    };
  
    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;
  
    string = Utf8Encode(string);
  
    x = ConvertToWordArray(string);
  
    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
  
    for (k=0;k