javascript - 数组过滤器 - 寻找带有字母和数字的字符串值
问题描述
我有一个奇怪的问题,我的数组过滤器适用于数组中的所有值,除非字符串值包含数字和字母的混合。至少这是我认为的问题。
请看下面的两个例子。在第一种情况下,我正在寻找card_id
具有 value的记录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":"jinky32@gmail.com","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":"jinky32@gmail.com","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":"jinky32@gmail.com","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":"jinky32@gmail.com","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":"jinky32@gmail.com","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":"jinky32@gmail.com","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"
);
谁能告诉我在这里做错了什么?我觉得我一定犯了一些愚蠢的错误!
解决方案
function filterCards(cardsArray, path, cardProperty) {
console.log("ORIGINAL ARRAY " + JSON.stringify(cardsArray));
if (path === "want" || path === "own") {
path = path[0].toUpperCase() + path.substring(1);
}
var filtered = cardsArray.filter(card => card[cardProperty] === path);
console.log("FILTERED ARRAY " + JSON.stringify(filtered));
return filtered;
}
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": "jinky32@gmail.com",
"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": "jinky32@gmail.com",
"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": "jinky32@gmail.com",
"variation": "Cracked Ice",
"year": "2013"
}]
var newArray = filterCards(
arr,
"1602670475144",
"card_id"
);
问题是您正在准确地搜索号码。当 cardid- 在前面时,它不会找到任何东西,因为没有任何东西完全匹配。我建议您搜索 cardid-1602670475144 而不是 1602670475144。这匹配正确。
(我更新了代码片段以更简洁并使用 ES6——如果可能,我建议你使用它)
推荐阅读
- sql - group by 不使用 where 子句给出结果
- postgresql - 如何在 PostgreSQL 中以区分大小写的方式对结果进行排序?
- css - CSS - 将样式应用于不是特定类型的最后一个元素
- angular - Angular 7.2.15 + 三个 0.105.2 在三个.js 升级后不起作用
- javascript - 为什么以及何时在 JS 中使用 .target
- ios - 如何更改 List 中的 ListStyle
- java - 跨多个独立服务器生成唯一 ID
- sql - 对于rails中的某个条件,我如何划分两列的总和
- laravel - 如何修复 Laravel 查询生成器,其中子句整数变量转换为字符串
- java - 如何以镶木地板格式将 11k 列数据插入配置单元表?