Как упростить использование деструктурирования массива

#javascript #node.js #arrays #ecmascript-6 #eslint

#javascript #node.js #массивы #ecmascript-6 #eslint

Вопрос:

eslint продолжает показывать мне prefer-restructuring ошибку. Однако я действительно не знаю, как работает деструктурирование массива, и хотел бы получить некоторую помощь.

Эти две строки возвращают ошибку:

 word.results.inCategory = word.results.inCategory[0];

// and:

word.results = word.results.filter(
 (res) =>
  Object.keys(res).includes('partOfSpeech') amp;amp;
  Object.keys(res).includes('inCategory')
)[0];
  

Опять же, я не очень разбираюсь в этой области, поэтому буду признателен за любую помощь в том, как исправить / упростить это конкретно!

ошибка eslint


РЕДАКТИРОВАТЬ: Вот пример объекта для справки:

 {
  word: 'midrash',
  results: [{
    definition: '(Judaism) an ancient commentary on part of the Hebrew scriptures that is based on Jewish methods of interpretation and attached to the biblical text',
    partOfSpeech: 'noun',
    inCategory: ['judaism'],
    typeOf: [ 'comment', 'commentary' ]
  },
  { 
    definition: 'something',
    partOfSpeech: 'something',
  }],
  syllables: { count: 2, list: [ 'mid', 'rash' ] },
  pronunciation: { all: "'mɪdrɑʃ" },
  frequency: 1.82
}
  

Комментарии:

1. Вы должны создать минимально воспроизводимый пример (предпочтительно на codesandbox )

2. Вы не можете использовать деструктурирование для переопределения свойств объекта, что означает, что вам придется использовать два оператора, что-то вроде const { results: { inCategory: [ category ] } } = word; word.results.inCategory = category;

3. К вашему сведению, вы можете использовать find вместо filter , если вам просто нужно первое столкновение

Ответ №1:

Чтобы получить значение inCategory , вы должны использовать назначение деструктурирования следующим образом:

 const obj = {
  word: 'midrash',
  results: {
    definition: '(Judaism) an ancient commentary on part of the Hebrew scriptures that is based on Jewish methods of interpretation and attached to the biblical text',
    partOfSpeech: 'noun',
    inCategory: 'judaism',
    typeOf: [ 'comment', 'commentary' ]
  },
  syllables: { count: 2, list: [ 'mid', 'rash' ] },
  pronunciation: { all: "'mɪdrɑʃ" },
  frequency: 1.82
}

let {results: {inCategory: category}} = obj;

//Now you can assign the category to word.results.inCategory
console.log(category);  

Для подхода с фильтром я предлагаю использовать функцию Array.prototype.find

 word.results = word.results.find(
 (res) =>
  Object.keys(res).includes('partOfSpeech') amp;amp;
  Object.keys(res).includes('inCategory')
); 
  

Комментарии:

1. Спасибо, оба варианта отлично сработали! Из любопытства, есть ли какая-либо разница между .find() и .filter() в этой конкретной ситуации?

2. @Lioness100 поскольку вы хотите получить первый индекс независимо от количества объектов, вы можете получить первое совпадение с помощью функции find .

Ответ №2:

Если вы уже уверены, что ваша структура данных правильная и оба word.results.inCategory и word.results являются массивами, то вот как вы это делаете:

 const { results:{ inCategory: [inCategory] }} = word;
word.results.inCategory = inCategory;

// and:

const [results] = word.results.filter(
 (res) =>
  Object.keys(res).includes('partOfSpeech') amp;amp;
  Object.keys(res).includes('inCategory')
);

word.results = results;
  

Конечно, во втором разрушении при фильтрации вы можете просто использовать find, который позволяет вам напрямую устанавливать word.results без разрушения:

 word.results = word.results.find(
 (res) =>
  Object.keys(res).includes('partOfSpeech') amp;amp;
  Object.keys(res).includes('inCategory')
);