#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];
Опять же, я не очень разбираюсь в этой области, поэтому буду признателен за любую помощь в том, как исправить / упростить это конкретно!
РЕДАКТИРОВАТЬ: Вот пример объекта для справки:
{
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')
);