Quick actions

cmd+k|ctrl+k

Navigation

Languages

replaceAll by map

Snippet info

Language

JavaScript

Visibility

public

Author

pheker

Created

2018-04-01T12:42:40Z

Updated

2018-04-18T12:34:51Z


//just like replaceAll.k as regexp and v as replace statement.

String.prototype.replaceMap = function () {
    var args = arguments,
        len = arguments.length;
    var judge = Object.prototype.toString,
        $string = "[object String]",
        $object = "[object Object]";
    var $this = this,
        obj = {};

    // 0x0 string,string
    // 0x1 object...
    // 0x2 object...function

    if (len === 0 || (len === 1 && judge.call(args[0]) !== $object)) {
        throw new Error("arguments type error !");
    }
    if (len > 2) {
        //check and merge
        for (var i = 0; i < len - 1; i++) {
            if (judge.call(args[i]) !== $object) {
                throw new Error("arguments type error !");
            }
            obj = Object.assign(obj, args[i]);
        }
    }


    //0x0
    if (judge.call(args[0]) === $string){
        if(judge.call(args[1]) === $string) {
            return this.replace(new RegExp(args[0], "gm"), args[1]);
        }else if(typeof args[1] === "function"){
            return this.replace(new RegExp(args[0], "gm"), args[1](args[0]));
        }else{
            throw new Error("arguments type error !");
        }
    } else if (judge.call(args[0]) === $object) {
        obj = Object.assign(obj, args[0]);
        //0x1
        if (judge.call(args[len - 1]) === $object) {
            obj = Object.assign(obj, args[len - 1]);
            return deal(obj);
            //0x2
        } else if (typeof args[len - 1] === "function") {
            return deal(obj, args[len - 1])
        } else {
            throw new Error("arguments type error !");
        }

    } else {
        throw new Error("arguments type error !");
    }

    function deal(obj, cb) {
        console.log("src: ", obj);
        var ret = $this;
        if (cb) {
            for (var key in obj) {
                ret = ret.replace(new RegExp(key, "gm"), cb(obj[key], key, obj));
            }
        } else {
            for (var key in obj) {
                ret = ret.replace(new RegExp(key, "gm"), obj[key]);
            }
        }
        return ret;
    }

    return $this;
}


//test

var str = "abc/微笑,sdf/zz,/#hello";

//eg
// var str = str.replaceMap("/微笑","86");

var str = str.replaceMap({
    "/微笑": 86,
    "/爱心": 33
});

var str = str.replaceMap({
    "/微笑": 86,
    "/爱心": 33
}, {
    "/zz": 111,
    "/爱心": 33
});

str = str.replaceMap({
    "/#hello": 999
}, function (v, k, obj) {
    console.log(v, k, obj)
    return "#" + v + "#";
});
console.log(str)
INFO