Как реализовать метод цепочки - PullRequest
1 голос
/ 31 мая 2019

Есть ли способ связать следующие методы из Cache class

cache = cache.getKey(key) || cache.setKey(key).get(key); // cache = cache.getKey(key) || cache.setKey(key).getKey(key);

Я знаю, что у нас есть нативные методы Map.prototype​.set() и Map.prototype​.get(), но я хочу реализоватьэто так.Дайте мне знать, если у вас есть какие-либо предложения.

function isObject(arg) {
  const typeOfObj = typeof arg;
  return (typeOfObj === 'object' || typeOfObj === 'function') && arg !== null;
}

class Cache {
  constructor() {
    this.map = new Map();
    this.weakmap = new WeakMap();
  }

  setKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    return map.set(key, new Cache());
  }

  getKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    return map.get(key);
  }
}

function getCache(args, cache) {
  for (const key of args) {
    cache = cache.getKey(key) || cache.setKey(key).get(key);
    // cache = cache.getKey(key) || cache.setKey(key).getKey(key);
  }
  return cache;
}

function memoize(fn) {
  const cache = new Cache();
  return (...args) => {
    const item = getCache(args, cache);

    if (Reflect.has(item, 'value')) {
      return item.value;
    }

    return (item.value = fn(args));
  };
}

let counter = 1;
function foo() {
  counter += 1;
  return counter;
}

const id1 = Symbol('id');
const id2 = Symbol('id');

const memoizedFoo = memoize(foo);
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id2)); // 3
console.log(memoizedFoo(id2)); // 3

Любая помощь с благодарностью.

1 Ответ

1 голос
/ 31 мая 2019

К сожалению, если вы пытаетесь «получить» ключ, вы не можете вернуть карту, так как вы запрашиваете ключ, поэтому он должен вернуть ключ.Таким образом, вы не можете связать этот метод.Но любой метод, который не должен возвращать что-то по умолчанию (IE будет недействительным), мы можем сделать это:

cache = cache.getKey (key) ||cache.setKey (ключ) .get (ключ);

Возвращает логическое значение, как ||Символ означает возвращать true, если любой из них равен true.

Но если вы хотите выполнить цепочку, которую выполняет JQuery, это легко достижимо!То, что вы хотите сделать, это вернуть this или объект в каждом методе.

Примерно так:

function isObject(arg) {
  const typeOfObj = typeof arg;
  return (typeOfObj === 'object' || typeOfObj === 'function') && arg !== null;
}

class Cache {
  constructor() {
    this.map = new Map();
    this.weakmap = new WeakMap();
  }

  setKey(key) {
    const map = this[isObject(key) ? 'weakmap' : 'map'];
    map.set(key, new Cache());
    return this; // HERE'S THE IMPORTANT PART
  }
}

let counter = 1;
function foo() {
  counter += 1;
  return counter;
}

const id1 = Symbol('id');
const id2 = Symbol('id');

const memoizedFoo = memoize(foo);
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id1)); // 2
console.log(memoizedFoo(id2)); // 3
console.log(memoizedFoo(id2)); // 3
...