Я пытаюсь отфильтровать ключ, в данном случае 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"
}
]
Ответ на следующий вопрос уже может дать общее решение... «Как выборочно копировать свойства из глубоко вложенной структуры данных?»
Я пытаюсь отфильтровать count
из всех элементов теста, в которых есть options
извини, я отредактировал свой вопрос
К какой строке относится ошибка? Предлагаю поставить свой item
, чтобы определить, того ли вы ожидаете.
filter()
используется для фильтрации части массива, а не для удаления вложенных ключей объекта.
Самый простой способ добиться желаемого результата — это:
options
options
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);
Очень ясно и очень понятно! Спасибо
Вы можете деструктурировать объекты и удалить ненужное свойство.
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);
Милый, ты использовал нулевой оператор объединения.
удалить (любой вариант).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);
Непонятно, что вы пытаетесь сделать.