Как отфильтровать массив объектов по ключу

Есть похожие вопросы, но я не могу найти что-то, чтобы точно решить этот вопрос.

У меня есть массив такой формы:

AllReviews: [

{"0001": [
         {"Review": "In a Pickle", "Notes": "Approved"},
         {"Review": "A Cat Nap", "Notes": "Approved"},
         {"Review": "Flea market", "Notes": "Approved"}
       ]
},
{"0002": [
         {"Review": "Mouth-watering", "Notes": "Approved"},
         {"Review": "Easy As Pie", "Notes": "Approved"},
       ]
},
{"0003": [
         {"Review": "Loved it", "Notes": "Approved"},
         {"Review": "To sweet", "Notes": "Rejected"}
       ]
}

]

Я хочу отфильтровать этот массив, чтобы он возвращал только обзор 002. Я не могу понять, как это сделать. Моя попытка была слабой:

AllReviews.value.filter((Review) => {
   for (const [Key, Value] of Object.entries(Review)) {
    return Review[Key] === 0002 // Trying to say return the value (the array with reviews and notes) where the Key of the object matches what I want e.g. 0002
 }
})

Мой код, конечно, ерунда и работать не будет.

Почему Review[Key] в Review[Key] == 002? Вы хотите фильтровать по ключу, а не по обзору.

jabaa 25.07.2024 18:59

@jabaa Я не знаю, что делаю. Мне просто нужно значение 0002, но я не могу подобрать код для его выбора.

volume one 25.07.2024 19:02

@MisterJojo да, вы правы, я ввел это вручную в редактор SO и забыл все кавычки

volume one 25.07.2024 19:18

Лучшим решением было бы исправить ваш json так, чтобы он был Property:Value, а не текущий Value:Value. например AllReviews = [ { "ID":"0001", "Reviews": [ {...

fdomn-m 25.07.2024 19:29

@fdomn-m но это не так Value:Value. Это Property(0002):Value(Object): не так ли?

volume one 25.07.2024 19:47

Возможно такая формулировка: изменить на "Key":"Value" или "PropertyName":"Value" — в JSON. Value(0002) не является именем ключа/свойства и не JSON.

fdomn-m 25.07.2024 19:50

@fdomn-m Хотя два приведенных ниже решения работают, после дальнейшего прогресса вы были правы в том, что наличие данных в формате [{ "ReviewID": "12345", "Reviews": [ {... значительно упрощает работу с ними. Было очень сложно вставлять и удалять исходную структуру.

volume one 26.07.2024 15:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Просто:

const AllReviews =
    [ { '0001': 
        [ { Review: 'In a Pickle', Notes: 'Approved'} 
        , { Review: 'A Cat Nap',   Notes: 'Approved'} 
        , { Review: 'Flea market', Notes: 'Approved'} 
      ] } 
    , { '0002': 
        [ { Review: 'Mouth-watering', Notes: 'Approved'} 
        , { Review: 'Easy As Pie',   Notes: 'Approved'} 
      ] } 
    , { '0003': 
        [ { Review: 'Loved it', Notes: 'Approved'} 
        , { Review: 'To sweet', Notes: 'Rejected'} 
    ] } ];
    
const Result = AllReviews.filter( row => row.hasOwnProperty('0002') );

console.info( Result );
.as-console-wrapper{max-height:100% !important;top:0}
.as-console-row::after{display:none !important;}

Спасибо за это, я сам работал над этим еще дольше и думаю, что нашел решение. Что вы думаете?

volume one 25.07.2024 19:45

@volumeone Я думаю, что всегда, по крайней мере с точки зрения кодирования, лучшее решение — это то, которое проще всего понять…

Mister Jojo 25.07.2024 21:10

Я согласен, но иногда мы не можем контролировать исходные данные.

volume one 25.07.2024 21:38

Почему бы просто не использовать найти ? Нам не нужно перебирать весь массив, если мы его уже нашли (конечно, если параметр уникален).

EzioMercer 26.07.2024 00:03

@EzioMercer, верно, .find() или .findIndex() было бы лучше, если бы с этим свойством была только одна строка. Но вопрос ОП просит использовать фильтр без четкого указания, есть ли другие строки, соответствующие этому критерию.

Mister Jojo 26.07.2024 00:15

Я сам это понял:

let AllReviews = [
{"0001": [
         {"Review": "In a Pickle", "Notes": "Approved"},
         {"Review": "A Cat Nap", "Notes": "Approved"},
         {"Review": "Flea market", "Notes": "Approved"}
       ]
},
{"0002": [
         {"Review": "Mouth-watering", "Notes": "Approved"},
         {"Review": "Easy As Pie", "Notes": "Approved"},
       ]
},
{"0003": [
         {"Review": "Loved it", "Notes": "Approved"},
         {"Review": "To sweet", "Notes": "Rejected"}
       ]
}
];

let Result;
AllReviews.forEach((Review) => {
  for (const [Key, Value] of Object.entries(Review)) {
    if (Number(Key) === 0002 && Value != null && Value.length) {
      Result = {
        [Key]: Review[Key]
      }
    }
  }
})

console.info(Result);

Очевидно, что 0002 не будет жестко запрограммировано в производстве и является переменной.

Тест заключается в том, дает ли он вам правильный результат. Я преобразовал для вас фрагмент, но, возможно, я не дал правильного определения AllReviews = — отредактируйте фрагмент, чтобы продемонстрировать его работу. (.map, а не .forEach, чтобы предоставить возвращаемое значение, но затем также необходимо фильтровать нули)

fdomn-m 25.07.2024 19:54

@fdomn-m Отредактировал, чтобы показать работу.

volume one 25.07.2024 20:31

@том первый; можно просто использовать if (Number(Key) === 2 && .... или if (Key === '0002' &&.....

Haluk 26.07.2024 08:54

@Haluk Это идентификаторы из базы данных целого типа. Таким образом, 002 будет введено как число. Полагаю, вместо этого я мог бы преобразовать 0002.toString().

volume one 26.07.2024 12:33

Другие вопросы по теме