Как отфильтровать ключ из объекта второго уровня вложенного массива объектов

Я пытаюсь отфильтровать ключ, в данном случае count из вложенного массива объектов.

У меня есть

let test  = [
 {
  "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8",
  "label": "Sector2",
  "options": {
   "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {
    "index": 0,
    "value": "Bob",
    "label": "Bob",
    "count": 1
   },
   "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {
    "index": 1,
    "value": "Student",
    "label": "Student",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {
    "index": 2,
    "value": "BBB",
    "label": "BBB",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {
    "index": 3,
    "value": "Orange Duck",
    "label": "Orange Duck",
    "count": 1
   }
  }
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485",
  "label": "Brown Cow"
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ",
  "label": "Red Fish"
 }
]

 test = test.filter(item => item[0].options['count']);

но я получаю Cannot read properties of undefined

Я пытаюсь отфильтровать количество всех элементов теста, у которых есть параметры.

желаемый результат

Спасибо

[
 {
  "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8",
  "label": "Sector2",
  "options": {
   "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {
    "index": 0,
    "value": "Bob",
    "label": "Bob"
   },
   "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {
    "index": 1,
    "value": "Student",
    "label": "Student"
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {
    "index": 2,
    "value": "BBB",
    "label": "BBB",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {
    "index": 3,
    "value": "Orange Duck",
    "label": "Orange Duck"
   }
  }
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485",
  "label": "Brown Cow"
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ",
  "label": "Red Fish"
 }
]

Непонятно, что вы пытаетесь сделать.

0stone0 29.04.2024 17:57

Ответ на следующий вопрос уже может дать общее решение... «Как выборочно копировать свойства из глубоко вложенной структуры данных?»

Peter Seliger 29.04.2024 17:59

Я пытаюсь отфильтровать count из всех элементов теста, в которых есть options

Einarr 29.04.2024 18:00

извини, я отредактировал свой вопрос

Einarr 29.04.2024 18:00

К какой строке относится ошибка? Предлагаю поставить свой item, чтобы определить, того ли вы ожидаете.

mykaf 29.04.2024 18:10
Поведение ключевого слова "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) для оценки ваших знаний,...
2
5
95
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

filter() используется для фильтрации части массива, а не для удаления вложенных ключей объекта.


Самый простой способ добиться желаемого результата — это:

  1. Цикл по каждому объекту
  2. Если у этого объекта есть options
  3. Прокрутите каждый options
  4. Используйте удалить, чтобы удалить count текущего объекта.

const data = [{"id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8", "label": "Sector2", "options": {"62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {"index": 0, "value": "Bob", "label": "Bob", "count": 1 }, "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {"index": 1, "value": "Student", "label": "Student", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {"index": 2, "value": "BBB", "label": "BBB", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {"index": 3, "value": "Orange Duck", "label": "Orange Duck", "count": 1 } } }, {"id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485", "label": "Brown Cow" }, {"id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ", "label": "Red Fish" } ];

for (let i in data) {
    if (data[i]?.options) {
        for (let j in data[i].options) {
            delete data[i].options[j]?.count;
        }
    }
}

console.info(data);

Очень ясно и очень понятно! Спасибо

Einarr 29.04.2024 18:09

Вы можете деструктурировать объекты и удалить ненужное свойство.

const
    filter = ({ count, ...o }) => Object.fromEntries(Object
        .entries(o)
        .map(([k, v]) => [k, v && typeof v === 'object' ? filter(v) : v])
    ),
    data = [{ id: "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8", label: "Sector2", options: { "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": { index: 0, value: "Bob", label: "Bob", count: 1 }, "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": { index: 1, value: "Student", label: "Student", count: 1 }, c59ea1159f33b91a7f6edc6925be5e373fc543e4: { index: 2, value: "BBB", label: "BBB", count: 1 }, c59ea1159f33b91a7f6edc6925be5e373fc54AAA: { index: 3, value: "Orange Duck", label: "Orange Duck", count: 1 } } }, { id: "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485", label: "Brown Cow" }, { id: "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ", label: "Red Fish" }],
    result = data.map(filter);

 console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

let test  = [
 {
  "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8",
  "label": "Sector2",
  "options": {
   "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {
    "index": 0,
    "value": "Bob",
    "label": "Bob",
    "count": 1
   },
   "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {
    "index": 1,
    "value": "Student",
    "label": "Student",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {
    "index": 2,
    "value": "BBB",
    "label": "BBB",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {
    "index": 3,
    "value": "Orange Duck",
    "label": "Orange Duck",
    "count": 1
   }
  }
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485",
  "label": "Brown Cow"
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ",
  "label": "Red Fish"
 }
]



test = test.map(o => !o.options ? o : Object.fromEntries(
  Object.entries(o.options).map(([key, {
    count,
    ...rest
  }]) => [
    key, rest
  ])
));

console.info(test)

Общее решение проблемы ОП, независимо от предоставленной структуры данных, структурно клонирует такой объект, опуская при этом любое свойство, которое соответствует предоставленному набору пропущенных ключей/имен свойств...

let sampleData = [{
  "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8",
  "label": "Sector2",
  "options": {
    "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {
      "index": 0,
      "value": "Bob",
      "label": "Bob",
      "count": 1
    },
    "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {
      "index": 1,
      "value": "Student",
      "label": "Student",
      "count": 1
    },
    "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {
      "index": 2,
      "value": "BBB",
      "label": "BBB",
      "count": 1
    },
    "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {
      "index": 3,
      "value": "Orange Duck",
      "label": "Orange Duck",
      "count": 1
    }
  }
}, {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485",
  "label": "Brown Cow"
}, {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ",
  "label": "Red Fish"
}];

console.info(
  cloneDataAndIgnoreKeys(
    sampleData,
    new Set(['count']),
  )
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<script>
function cloneDataAndIgnoreKeys(
  dataSource, ignoredKeys = new Set, dataTarget = {}
) {
  if (Array.isArray(dataSource)) {

    dataTarget = dataSource
      .map(item =>
        cloneDataAndIgnoreKeys(item, ignoredKeys)
      );
  } else if (!!dataSource && (typeof dataSource === 'object')) {

    dataTarget = Object
      .entries(dataSource)
      .reduce((target, [key, value]) => {

        if (!ignoredKeys.has(key)) {
          target[key] =
            cloneDataAndIgnoreKeys(value, ignoredKeys);
        }
        return target;

      }, dataTarget);

  } else {
    dataTarget = dataSource;
  }
  return dataTarget;
}
</script>

Вы можете сделать это как однострочник следующим образом:

const data = [{"id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8", "label": "Sector2", "options": {"62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {"index": 0, "value": "Bob", "label": "Bob", "count": 1 }, "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {"index": 1, "value": "Student", "label": "Student", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {"index": 2, "value": "BBB", "label": "BBB", "count": 1 }, "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {"index": 3, "value": "Orange Duck", "label": "Orange Duck", "count": 1 } } }, {"id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485", "label": "Brown Cow" }, {"id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ", "label": "Red Fish" } ];

data.forEach(i => Object.values(i.options ?? {}).forEach(i => delete i.count))

console.info(data);

Милый, ты использовал нулевой оператор объединения.

Einarr 29.04.2024 20:05
  • используйте функцию карты для перебора вашего массива.
  • Создайте копию своих вариантов.
  • Используйте цикл for-in для проверки свойств объекта и их устранения. из массива.
  • При включении этого кода в свой проект обязательно включите следующие корректировки, чтобы избежать ошибок типа. Онлайн-компилятор не принимает любой тип.

удалить (любой вариант).count;

(newItem.options как любой)?.optionKey;

Спасибо

let test  = [
 {
  "id": "c3c6f410f58e5836431b473ebcf134756232d04f2bf35edff8",
  "label": "Sector2",
  "options": {
   "62f92fab79ac81d933765bd0bbc4a1f5ea26cb3a088bcb4e6e": {
    "index": 0,
    "value": "Bob",
    "label": "Bob",
    "count": 1
   },
   "2fe91aa3567c0d04c521dcd2fc7e40d7622bb8c3f594d503da": {
    "index": 1,
    "value": "Student",
    "label": "Student",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc543e4": {
    "index": 2,
    "value": "BBB",
    "label": "BBB",
    "count": 1
   },
   "c59ea1159f33b91a7f6edc6925be5e373fc54AAA": {
    "index": 3,
    "value": "Orange Duck",
    "label": "Orange Duck",
    "count": 1
   }
  }
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e951709485",
  "label": "Brown Cow"
 },
 {
  "id": "f794c6a52e793ee6f5c42cd5df6b4435236e3495e95170ZZZ",
  "label": "Red Fish"
 }
];

let filteredTest = test.map(item => {
    if (item?.options) {

        const newItem = { ...item };

    for (const optionKey in newItem.options) 
  {

   if (newItem.options.hasOwnProperty(optionKey)) 
  {

  const option = newItem.options[optionKey];
   if (option && 'count' in option) {
        delete option?.count;
       }
     }
   }

return newItem;

   }

 return item;

});
console.info(filteredTest);

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