對象數(shù)組如何去重:
//根據(jù)每個對象的某一個具體屬性來進(jìn)行去重
const responseList = [
{ id: 1, a: 1 },
{ id: 2, a: 2 },
{ id: 3, a: 3 },
{ id: 1, a: 4 },
];
const result = responseList.reduce((acc, cur) => {
const ids = acc.map(item => item.id);
return ids.includes(cur.id) ? acc : [...acc, cur];
}, []);
console.log(result); // -> [ { id: 1, a: 1}, {id: 2, a: 2}, {id: 3, a: 3} ]
reduce 實現(xiàn)對象數(shù)組去重復(fù):
var resources = [
{ name: "張三", age: "18" },
{ name: "張三", age: "19" },
{ name: "張三", age: "20" },
{ name: "李四", age: "19" },
{ name: "王五", age: "20" },
{ name: "趙六", age: "21" }
]
var temp = {};
resources = resources.reduce((prev, curv) => {
// 如果臨時對象中有這個名字移层,什么都不做
if (temp[curv.name]) {
}else {
// 如果臨時對象沒有就把這個名字加進(jìn)去奕删,同時把當(dāng)前的這個對象加入到prev中
temp[curv.name] = true;
prev.push(curv);
}
return prev
}, []);
console.log("結(jié)果", resources);
實現(xiàn)一個函數(shù)判斷數(shù)據(jù)類型:
function getType(obj) {
if (obj === null) return String(obj);
return typeof obj === 'object'
? Object.prototype.toString.call(obj).replace('[object ', '').replace(']', '').toLowerCase()
: typeof obj;
}
// 調(diào)用
getType(null); // -> null
getType(undefined); // -> undefined
getType({}); // -> object
getType([]); // -> array
getType(123); // -> number
getType(true); // -> boolean
getType('123'); // -> string
getType(/123/); // -> regexp
getType(new Date()); // -> date
查找字符串中出現(xiàn)最多的字符和個數(shù):
// 例: abbcccddddd -> 字符最多的是d挖诸,出現(xiàn)了5次
let str = "abcabcabcbbccccc";
let num = 0;
let char = '';
// 使其按照一定的次序排列
str = str.split('').sort().join('');
// "aaabbbbbcccccccc"
// 定義正則表達(dá)式
let re = /(\w)\1+/g;
str.replace(re,($0,$1) => {
if(num < $0.length){
num = $0.length;
char = $1;
}
});
console.log(`字符最多的是${char}皱蹦,出現(xiàn)了${num}次`);
實現(xiàn)千位分隔符:
function parseToMoney(num) {
num = parseFloat(num.toFixed(3));
let [integer, decimal] = String.prototype.split.call(num, '.');
integer = integer.replace(/\d(?=(\d{3})+$)/g, '$&,');
return integer + '.' + (decimal ? decimal : '');
}
// 保留三位小數(shù)
parseToMoney(1234.56); // return '1,234.56'
parseToMoney(123456789); // return '123,456,789'
parseToMoney(1087654.321); // return '1,087,654.321'
判斷是否是電話號碼:
function isPhone(tel) {
var regx = /^1[34578]\d{9}$/;
return regx.test(tel);
}
驗證是否是郵箱:
function isEmail(email) {
var regx = /^([a-zA-Z0-9_\-])+@([a-zA-Z0-9_\-])+(\.[a-zA-Z0-9_\-])+$/;
return regx.test(email);
}
驗證是否是身份證:
function isCardNo(number) {
var regx = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
return regx.test(number);
}
實現(xiàn)數(shù)組扁平化:
//第一種處理
let ary = [1, [2, [3, [4, 5]]], 6];
let str = JSON.stringify(ary);
console.log(str.replace(/(\[|\])/g, '').split(','))
/****************************************************************/
//第二種處理:用 reduce 實現(xiàn)數(shù)組的 flat 方法
function flatten(ary) {
return ary.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
}, []);
}
let ary = [1, 2, [3, 4], [5, [6, 7]]]
console.log(flatten(ary))
實現(xiàn)對象扁平化:
function objectFlat(obj = {}) {
const res = {}
function flat(item, preKey = '') {
Object.entries(item).forEach(([key, val]) => {
const newKey = preKey ? `${preKey}.${key}` : key
if (val && typeof val === 'object') {
flat(val, newKey)
} else {
res[newKey] = val
}
})
}
flat(obj)
return res
}
// 測試
const source = { a: { b: { c: 1, d: 2 }, e: 3 }, f: { g: 2 } }
console.log(objectFlat(source));
數(shù)組降維:
[1, [2], 3].flatMap(v => v)
// -> [1, 2, 3]
/**********************************************************/
const flattenDeep = (arr) => Array.isArray(arr)
? arr.reduce( (a, b) => [...a, ...flattenDeep(b)] , [])
: [arr]
flattenDeep([1, [[2], [3, [4]], 5]])