Чистая замена JavaScript для Lodash'es 'omit ()' - PullRequest
0 голосов
/ 10 ноября 2019

Я искал замену Lodash omit(), используя только JavaScript. Вот чего я хочу достичь:

function omit(obj, attr) {
  // @obj: original object
  // @attr: string, attribute I want to omit
  // return a new object, do not modify the original object
}

До сих пор я нашел это решение:

let { attr, ...newObj } = obj;

Но оно работает, только если известно attr. Я хочу, чтобы attr был динамическим, поэтому attr должен быть строкой. Как я могу это сделать?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2019

Используйте вычисленное имя свойства, чтобы «извлечь» свойство, которое вы хотите удалить при деструктурировании:

function omit(obj, attr) {
  const { [attr]: _, ...newObj } = obj;
  return newObj;
}

console.log(omit({ foo: 'foo', bar: 'bar', baz: 'baz' }, 'bar'));
2 голосов
/ 10 ноября 2019

Функция _.omit() поддерживает исключение нескольких клавиш. Функция принимает список параметров, массив ключей или комбинацию параметров и массивов. Чтобы сохранить эту функциональность, вы можете использовать остальные параметры , сгладить их до установить , преобразовать объект в массив записей с помощью Object.entries(), отфильтруйте его, а затем преобразуйте обратно в объект, используя Object.fromEntries().

function omit(obj, ...keys) {
  const keysToRemove = new Set(keys.flat()); // flatten the props, and convert to a Set
  
  return Object.fromEntries( // convert the entries back to object
    Object.entries(obj) // convert the object to entries
      .filter(([k]) => !keysToRemove.has(k)) // remove entries with keys that exist in the Set
  );
}

console.log(omit({ foo: 'foo', bar: 'bar', baz: 'baz' }, 'bar'));
console.log(omit({ foo: 'foo', bar: 'bar', baz: 'baz' }, 'bar', 'baz'));
console.log(omit({ foo: 'foo', bar: 'bar', baz: 'baz' }, ['bar', 'baz']));
console.log(omit({ foo: 'foo', bar: 'bar', baz: 'baz' }, 'bar', ['baz']));
...