Выборочное уничтожение объекта на основе имени ключа - PullRequest
0 голосов
/ 28 мая 2020

Допустим, у меня есть этот объект:

const someProps = { darkMode: true, underlineMistakes: false, spellingView: (...), grammerView: (...) };

Мне не обязательно знать имена каких-либо свойств, за исключением того, что 1+ оканчивается на 'View'.

и я хочу разрушить только те ключи, которые заканчиваются на 'view', что я хотел бы сделать что-то вроде:

const propsEndingInView = Object.keys(someProps).filter(prop => !prop.endsWith('View');
const {
  ...nonViewProps, // darkMode, underlineMistakes
  propsEndingInView // {spellingView: (...), grammerView: (...)}
} = someProps; 

Мне нужно как-то разделить два типа свойств, предпочтительно пока

Не знаю, как это сделать, и даже если это возможно.

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Разрушение - это просто способ получить свойства, которые вы уже знаете. Вы не можете этого сделать с деструктуризацией. Вы можете создать собственный метод для фильтрации ключей, чтобы получить подмножество объекта

const someProps = {
  darkMode: true,
  underlineMistakes: false,
  spellingView: 'spellingView',
  grammerView: 'grammerView'
};

const subset = Object.fromEntries(
  Object.entries(someProps).filter(([k]) => k.endsWith('View'))
)

console.log(subset)
1 голос
/ 28 мая 2020

Если я правильно понимаю, вы хотите получить объект, который содержит только свойства из someProps, имена которых заканчиваются на View. Вы можете сделать что-то вроде:

const viewProps = Object.keys(someProps).reduce((props, propName) => {
  // Here we check whether propName ends in View
  // If it does we add it to the object, if not we leave the object as it is
  return propName.match(/View$/) ? { ...props, [propName]: someProps[propName] } : props;
}, {});

Это поможет? Вы можете найти документацию по Array.reduce здесь .

1 голос
/ 28 мая 2020

Этого нельзя сделать с помощью деструктуризации, но вы можете написать код для этого. Например:

const extract = (obj, regex) => 
  Object
    .entries(obj)
    .filter(([k]) => (typeof k === 'string') && regex.test(k))
    .reduce((out, [k, v]) => (
      out[k] = v,
      out
    ), {})

const someProps = { darkMode: true, underlineMistakes: false, spellingView: '(...)', grammerView: '(...)' };

const propsEndingInView = extract(someProps, /View$/)
console.log(propsEndingInView)
...