Есть похожие вопросы, но я не могу найти что-то, чтобы точно решить этот вопрос.
У меня есть массив такой формы:
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
}
})
Мой код, конечно, ерунда и работать не будет.
@jabaa Я не знаю, что делаю. Мне просто нужно значение 0002
, но я не могу подобрать код для его выбора.
@MisterJojo да, вы правы, я ввел это вручную в редактор SO и забыл все кавычки
Лучшим решением было бы исправить ваш json так, чтобы он был Property:Value
, а не текущий Value:Value
. например AllReviews = [ { "ID":"0001", "Reviews": [ {...
@fdomn-m но это не так Value:Value
. Это Property(0002):Value(Object):
не так ли?
Возможно такая формулировка: изменить на "Key":"Value"
или "PropertyName":"Value"
— в JSON. Value(0002)
не является именем ключа/свойства и не JSON.
@fdomn-m Хотя два приведенных ниже решения работают, после дальнейшего прогресса вы были правы в том, что наличие данных в формате [{ "ReviewID": "12345", "Reviews": [ {...
значительно упрощает работу с ними. Было очень сложно вставлять и удалять исходную структуру.
Просто:
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;}
Спасибо за это, я сам работал над этим еще дольше и думаю, что нашел решение. Что вы думаете?
@volumeone Я думаю, что всегда, по крайней мере с точки зрения кодирования, лучшее решение — это то, которое проще всего понять…
Я согласен, но иногда мы не можем контролировать исходные данные.
Почему бы просто не использовать найти ? Нам не нужно перебирать весь массив, если мы его уже нашли (конечно, если параметр уникален).
@EzioMercer, верно, .find()
или .findIndex()
было бы лучше, если бы с этим свойством была только одна строка. Но вопрос ОП просит использовать фильтр без четкого указания, есть ли другие строки, соответствующие этому критерию.
Я сам это понял:
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 Отредактировал, чтобы показать работу.
@том первый; можно просто использовать if (Number(Key) === 2 && ....
или if (Key === '0002' &&.....
@Haluk Это идентификаторы из базы данных целого типа. Таким образом, 002 будет введено как число. Полагаю, вместо этого я мог бы преобразовать 0002.toString().
Почему
Review[Key]
вReview[Key] == 002
? Вы хотите фильтровать по ключу, а не по обзору.