1.Q:
function get() {
// 请补全函数参数和实现逻辑
}
const obj = { selector: { to: { toutiao: 'FE coder' } }, target: [1, 2, { name: 'byted' }] };
// 运行代码
get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name')
// 输出结果:
// ['FE coder', 1, 'byted']
A:
get(obj,...args) {
let arr=[]
args.forEach(item=>{
item=item.replace("]","").replace("[",".")
arr.push(this.path(obj,item))
})
return arr
},
path(obj,str){
let strArr=str.split('.')
return strArr.reduce((sum,cur)=>{
return sum[cur]
},obj)
},
2.Q 事件管理器实现 A:
let events={}
class Event
{
constructor(){
this.events={}
}
on(eventName,callBack){
// this.callbacks[eventName] = this.callbacks[eventName] || []
// this.callbacks[eventName].push(callBack)
if(this.events[eventName]) {
this.events[eventName].push(callBack)
} else {
this.events[eventName]=[callBack]
}
}
emit(eventName,params){
if(this.events[eventName]){
this.events[eventName].map((callBack)=>{
callBack(params)
})
}
}
delete(eventName,callBack){
if(this._events[eventName] === undefined){
throw new NoEventException(
`Can not unregister method, the event named "${event}" is not existed!`
);
}
const index = this.events[eventName].indexOf(callBack);
if(index === -1){
throw new NoEventException(
`Can not unregister method, the method named "${method}" is not in event "${events}"!`);
}
this.events[event].splice(index, 1);
if(this.events[event].length === 0){
delete this.events[event];
}
}
}
export default Event;
3.背包问题 求给定数组中 N 个数相加之和为 sum 所有可能集合,请补充以下代码
function findSumNumbers(array, n, sum) {
// 枚举所有n个数的组合,判断组合的和等于sum
let result = [];
const generateAll = function( collection, arr) {
if (collection.length === n) {
const s = collection.reduce((acc, c) => acc += c, 0);
if (s === sum) {
result.push(collection);
}
return;
}
for (let i = 0; i < arr.length; i++) {
generateAll( collection.concat(arr[i]), arr.slice(i + 1));
}
}
generateAll( [], array.slice(0));
return result;
}
值为[{"京酱肉丝":20.5},{"麻婆豆腐":10.7},{'北京烤鸭':101},{"数组与":80.5},{"luand1":101}]
function findSumNumbers(array, n, sum) {
// 枚举所有n个数的组合,判断组合的和等于sum
let result = [];
const generateAll = function( collection, arr) {
if (collection.length === n) {
const s = collection.reduce((acc, c) => acc += Object.values(c)[0], 0);
if (s === sum) {
result.push(collection);
}
return;
}
for (let i = 0; i < arr.length; i++) {
generateAll( collection.concat(arr[i]), arr.slice(i + 1));
}
}
generateAll([], array.slice(0));
return result;
}
不限制n
function findSumNumbers(array, sum) {
// 枚举所有n个数的组合,判断组合的和等于sum
let result = [];
const generateAll = function( collection, arr) {
const s = collection.reduce((acc, c) => acc += Object.values(c)[0], 0);
if (s === sum) {
result.push(collection);
}
for (let i = 0; i < arr.length; i++) {
generateAll( collection.concat(arr[i]), arr.slice(i + 1));
}
}
generateAll([], array.slice(0));
return result;
}
4.深拷贝
const isComplexDataType = obj => (typeof obj === 'object' || typeof obj === 'function') && (obj !== null)
const deepClone = function (obj, hash = new WeakMap()) {
if (obj.constructor === Date)
return new Date(obj) // 日期对象直接返回一个新的日期对象
if (obj.constructor === RegExp)
return new RegExp(obj) //正则对象直接返回一个新的正则对象
//如果循环引用了就用 weakMap 来解决
if (hash.has(obj)) return hash.get(obj)
let allDesc = Object.getOwnPropertyDescriptors(obj)
//遍历传入参数所有键的特性
let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)
//继承原型链
hash.set(obj, cloneObj)
for (let key of Reflect.ownKeys(obj)) {
cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') ? deepClone(obj[key], hash) : obj[key]
}
return cloneObj
}
5.使用localstorage实现一个支持过期时间的缓存
//缓存
var cache={
/**
* 设置缓存
* @param key
* @param value
* @param expiredTimeMS 过期时间,单位ms
*/
"set":function (key,value,expiredTimeMS) {
console.log("cache set: key="+key + " value = " + value + " expiredTimeMS = " + expiredTimeMS)
if((expiredTimeMS == 0 ) || (expiredTimeMS == null)){
localStorage.setItem(key,value);
}
else {
localStorage.setItem(key,JSON.stringify(value));
localStorage.setItem(key+'EXPIREDTIME',expiredTimeMS+Number(new Date().getTime()));
}
},
/**
* 获取键
* @param key
* @returns {*} key存在,返回对象;不存在,返回null
*/
"get":function (key) {
var expiredTime = localStorage.getItem(key+'EXPIREDTIME');
var curTime = new Date().getTime();
if((expiredTime) > curTime){
console.log("cache-缓存["+key+"]存在!");
return JSON.parse(localStorage.getItem(key));
}
else {
console.log("cache-缓存["+key+"]不存在!");
cache.remove(key);
return null;
}
},
/**
* 移除键
* @param key
*/
"remove":function (key) {
localStorage.removeItem(key);
localStorage.removeItem(key+'EXPIREDTIME');
},
/**
* 对键重新更新过期时间
* @param key
* @param expiredTimeMS 过期时间ms
*/
"expired":function (key,expiredTimeMS) {
if(cache.get(key)!=null){
localStorage.setItem(key+'EXPIREDTIME',expiredTimeMS+Number(new Date().getTime()));
}
},
/**
* 清除所有缓存
*/
"clear":function () {
localStorage.clear();
}
}
www.cnblogs.com/qianxiaox/p… 5.JavaScript 实现每次调用一个函数自动加1
var getId = (function () {
// "use strict";
var i = 0;
return function () {
return ++i;
};
})();
console.log(getId()); //1
console.log(getId()); //2
原文链接:https://blog.csdn.net/weixin_43971228/article/details/89146656