Фильтр массива - поиск строкового значения с буквами и цифрами

У меня странная проблема, когда мой фильтр массива работает со всеми значениями в массиве, за исключением случаев, когда строковое значение содержит смесь цифр и букв. По крайней мере, я думаю, что это проблема.

Пожалуйста, смотрите два примера ниже. В первом случае я ищу записи, где 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"
        
      );

Может ли кто-нибудь посоветовать, что я здесь делаю неправильно; Я чувствую, что, должно быть, совершаю какую-то глупую ошибку!


person Stuart Brown    schedule 20.10.2020    source источник
comment
Вам не нужно использовать Object.values(cardsArray).filter() — вместо этого используйте cardsArray.filter()   -  person AlexH    schedule 20.10.2020
comment
Я полагаю, вы хотите сделать if (path === "want" || path === "own") Это изменило ваше path свойство, которое вы искали в объектах карты   -  person Ludovit Mydla    schedule 20.10.2020
comment
Да, path === "want" || "own" всегда будет истинным, поскольку own (как и все непустые строки) правдив в JavaScript.   -  person AlexH    schedule 20.10.2020
comment
вау, я этого не знал! own и want — это пути в URL-адресах, так что мне придется посмотреть на это. Вы правы в том, что удаление условия для их проверки заставляет код работать!   -  person Stuart Brown    schedule 20.10.2020


Ответы (1)


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": "[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"
}]

var newArray = filterCards(
  arr,
  "1602670475144",
  "card_id"
);

Проблема в том, что вы ищете точно номер. Когда cardid- находится впереди, он ничего не найдет, потому что ничего не совпадает точно. Я рекомендую вам искать cardid-1602670475144 вместо 1602670475144. Это соответствует правильно.

(Я обновил фрагмент кода, чтобы сделать его более кратким и использовать ES6 — я рекомендую вам использовать его, если это возможно)

person AlexH    schedule 20.10.2020
comment
Спасибо за комментарий. Замена card[cardProperty].includes(path) помечает предупреждение о синтаксисе в VSCode для меня - person Stuart Brown; 20.10.2020
comment
Какое предупреждение? - person AlexH; 20.10.2020
comment
Если вы просто удалите часть card[cardProperty].includes(path) из своего ответа, я могу пометить это как ответ. Исправление на самом деле является изменением, которое вы вносите в оператор if `if (path === want || path === own)` из if (path === "want" || "own") кажется. Знаете, почему это имеет значение? - person Stuart Brown; 20.10.2020
comment
Это потому, что когда этот оператор запускается, он изменяет путь. Этот оператор всегда выполняется, поскольку own является отдельным оператором. Когда программа запускается, она думает, что вы пытаетесь проверить, является ли own true. В JavaScript непустые строки равны true. Таким образом, это утверждение всегда работает. Он запускается, когда он должен изменить его, как я сделал выше. - person AlexH; 20.10.2020