首页 > 解决方案 > 数组过滤器 - 寻找带有字母和数字的字符串值

问题描述

我有一个奇怪的问题,我的数组过滤器适用于数组中的所有值,除非字符串值包含数字和字母的混合。至少这是我认为的问题。

请看下面的两个例子。在第一种情况下,我正在寻找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"
        
      );

谁能告诉我在这里做错了什么?我觉得我一定犯了一些愚蠢的错误!

标签: javascriptarraysarray-filter

解决方案


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——如果可能,我建议你使用它)


推荐阅读