У меня странная проблема, когда мой фильтр массива работает со всеми значениями в массиве, за исключением случаев, когда строковое значение содержит смесь цифр и букв. По крайней мере, я думаю, что это проблема.
Пожалуйста, смотрите два примера ниже. В первом случае я ищу записи, где card_id
имеет значение cardid-1602670475144
. В этом случае массив фильтров всегда пуст.
let arr = [{"_id":{"$oid":"5f8b5f2f32d764f7ad4c450b"},"card_id":"cardid-1602670475144","brand":"National Treasures","card_number":{"$numberDouble":"100"},"career_stage":"Veteran","forTrade":"Yes","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"16"},"player":"Trent Williams","print_run":{"$numberDouble":"25"},"purchase_date":"Thu Aug 20 00:00:00 GMT+01:00 2020","series":"Century Materials","status":"Own","team":"Washington Football Team","type":"Patch","user":"[email protected]","variation":"Holo Silver"},{"_id":{"$oid":"5f8b5f2f32d764f7ad4c4537"},"card_id":"cardid-1602670491958","brand":"Playbook","card_number":{"$numberDouble":"85"},"career_stage":"Rookie Card","forTrade":"","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"80"},"player":"Ryan Kerrigan","print_run":{"$numberDouble":"299"},"purchase_date":"Tue Sep 01 00:00:00 GMT+01:00 2020","series":"Rookie Signatures","status":"Own","team":"Washington Football Team","type":"Auto","user":"[email protected]","variation":"Base","year":"2011"},{"_id":{"$oid":"5f8b5f3032d764f7ad4c455f"},"card_id":"cardid-1602670496512","brand":"Contenders","card_number":{"$numberDouble":"144"},"career_stage":"Rookie Card","forTrade":"Yes","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"0"},"player":"Jawan Jamison","print_run":{"$numberDouble":"21"},"purchase_date":"Mon Sep 14 00:00:00 GMT+01:00 2020","series":"Rookie Ticket Autographs","status":"Own","team":"Washington Football Team","type":"Auto","user":"[email protected]","variation":"Cracked Ice","year":"2013"}]
function filterCards(cardsArray, path, cardProperty) {
console.log("ORIGINAL ARRAY " + JSON.stringify(cardsArray));
if (path === "want" || "own") {
path = path[0].toUpperCase() + path.substring(1);
}
var filtered = Object.values(cardsArray).filter(function (card) {
if (card[cardProperty] === path) {
return true;
}
});
console.log("FILTERED ARRAY " + JSON.stringify(filtered));
return filtered;
}
var newArray = filterCards(
arr,
"cardid-1602670475144",
"card_id",
);
Во втором случае я изменяю данные так, чтобы card_id
имел значение 1602670475144
(т.е. я удалил префикс cardid-
) и ищу это. Затем возвращаются правильные данные.
let arr = [{"_id":{"$oid":"5f8b5f2f32d764f7ad4c450b"},"card_id":"1602670475144","brand":"National Treasures","card_number":{"$numberDouble":"100"},"career_stage":"Veteran","forTrade":"Yes","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"16"},"player":"Trent Williams","print_run":{"$numberDouble":"25"},"purchase_date":"Thu Aug 20 00:00:00 GMT+01:00 2020","series":"Century Materials","status":"Own","team":"Washington Football Team","type":"Patch","user":"[email protected]","variation":"Holo Silver"},{"_id":{"$oid":"5f8b5f2f32d764f7ad4c4537"},"card_id":"cardid-1602670491958","brand":"Playbook","card_number":{"$numberDouble":"85"},"career_stage":"Rookie Card","forTrade":"","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"80"},"player":"Ryan Kerrigan","print_run":{"$numberDouble":"299"},"purchase_date":"Tue Sep 01 00:00:00 GMT+01:00 2020","series":"Rookie Signatures","status":"Own","team":"Washington Football Team","type":"Auto","user":"[email protected]","variation":"Base","year":"2011"},{"_id":{"$oid":"5f8b5f3032d764f7ad4c455f"},"card_id":"cardid-1602670496512","brand":"Contenders","card_number":{"$numberDouble":"144"},"career_stage":"Rookie Card","forTrade":"Yes","image_path":"https://res.cloudinary.com/dkwmxhsem/image/upload/t_Card Resize/v1599758190/","manufacturer":"Panini","number":{"$numberDouble":"0"},"player":"Jawan Jamison","print_run":{"$numberDouble":"21"},"purchase_date":"Mon Sep 14 00:00:00 GMT+01:00 2020","series":"Rookie Ticket Autographs","status":"Own","team":"Washington Football Team","type":"Auto","user":"[email protected]","variation":"Cracked Ice","year":"2013"}]
function filterCards(cardsArray, path, cardProperty) {
console.log("ORIGINAL ARRAY " + JSON.stringify(cardsArray));
if (path === "want" || "own") {
path = path[0].toUpperCase() + path.substring(1);
}
var filtered = Object.values(cardsArray).filter(function (card) {
if (card[cardProperty] === path) {
return true;
}
});
console.log("FILTERED ARRAY " + JSON.stringify(filtered));
return filtered;
}
var newArray = filterCards(
arr,
"1602670475144",
"card_id"
);
Может ли кто-нибудь посоветовать, что я здесь делаю неправильно; Я чувствую, что, должно быть, совершаю какую-то глупую ошибку!
Object.values(cardsArray).filter()
— вместо этого используйтеcardsArray.filter()
- person AlexH   schedule 20.10.2020if (path === "want" || path === "own")
Это изменило вашеpath
свойство, которое вы искали в объектах карты - person Ludovit Mydla   schedule 20.10.2020path === "want" || "own"
всегда будет истинным, поскольку own (как и все непустые строки) правдив в JavaScript. - person AlexH   schedule 20.10.2020own
иwant
— это пути в URL-адресах, так что мне придется посмотреть на это. Вы правы в том, что удаление условия для их проверки заставляет код работать! - person Stuart Brown   schedule 20.10.2020