//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)