Я попытался отфильтровать объект JS, который включает в себя массив. Я хочу проверить, есть ли id
, matchcode
и description
. Это я пробовал, вот что:
let search = articles.filter(function(item){
return (item.matchcode.includes(articleno) || item.description.includes(articleno) || item.id.includes(articleno))
})
Это объект:
let articles = '[ {
"id": "35",
"matchcode": "KM Anteile S",
"description": "KM Anteile S ",
"unit": "STK",
"salesPrice": 0.7,
"stock": "HL-F",
"stockAmount": -3282
},
{
"id": "41",
"matchcode": "Arbeitszeit",
"description": "Arbeitszeit ",
"unit": "STD",
"salesPrice": 76.8,
"stock": "HL-F",
"stockAmount": 0.75
}, {
"id": "502019",
"matchcode": "Gummimuffe 100 mm",
"description": "Gummimuffe 100 mm ",
"unit": "STK",
"salesPrice": 9.8,
"stock": "HL-F",
"stockAmount": 15
}';
Когда я попробовал это, я получаю сообщение об ошибке, что filter
не является функцией.
Ваше значение articles
представляет собой (синтаксически неверный) нить, а не object
-граф. Вам нужно сначала запустить его JSON.parse
. Кроме того, строки JS, использующие одинарные '
или двойные кавычки "
, не могут содержать буквальные символы новой строки, если только они не являются шаблонными строками (обратными кавычками), но ваше значение let articles
использует одинарные кавычки. и содержит буквальные символы новой строки, которые просто не запустятся, потому что парсер отвергнет это.
Вам нужно закрыть [
с помощью ]
, и у вас есть строка, а не массив объектов. Вы также можете использовать JSON.parse()
. Это сделает работу:
let articles = [{
"id": "35",
"matchcode": "KM Anteile S",
"description": "KM Anteile S ",
"unit": "STK",
"salesPrice": 0.7,
"stock": "HL-F",
"stockAmount": -3282
},
{
"id": "41",
"matchcode": "Arbeitszeit",
"description": "Arbeitszeit ",
"unit": "STD",
"salesPrice": 76.8,
"stock": "HL-F",
"stockAmount": 0.75
}, {
"id": "502019",
"matchcode": "Gummimuffe 100 mm",
"description": "Gummimuffe 100 mm ",
"unit": "STK",
"salesPrice": 9.8,
"stock": "HL-F",
"stockAmount": 15
}
];
Кроме того, .filter()
возвращает новый массив, сохраняя исходный как есть.
Поскольку articles
— это строка, которую вам нужно проанализировать с помощью JSON.parse()
,
Примечание: как @Dai упоминается в комментарии к этому вопросу includes()
чувствителен к регистру, поэтому вы можете использовать другой подход для удобного поиска (без учета регистра)
Я решил использовать new RegExp()
и вместо includes()
я использовал match()
const articles = `[ {
"id": "35",
"matchcode": "KM Anteile S",
"description": "KM Anteile S ",
"unit": "STK",
"salesPrice": 0.7,
"stock": "HL-F",
"stockAmount": -3282
}, {
"id": "41",
"matchcode": "Arbeitszeit",
"description": "Arbeitszeit ",
"unit": "STD",
"salesPrice": 76.8,
"stock": "HL-F",
"stockAmount": 0.75
}, {
"id": "502019",
"matchcode": "Gummimuffe 100 mm",
"description": "Gummimuffe 100 mm ",
"unit": "STK",
"salesPrice": 9.8,
"stock": "HL-F",
"stockAmount": 15
}]
`;
const articlenenoFilter = "arbeitsze"
const articleneno = new RegExp(articlenenoFilter, "i")
const search = JSON.parse(articles).filter((item) => (item.matchcode.match(articleneno) || item.description.match(articleneno) || item.id.match(articleneno)))
console.info(search)
Я отмечаю, что String.prototype.includes
чувствителен к регистру, что, вероятно, не то, чего хочет ОП (поскольку похоже, что они хотят выполнять поиск, удобный для человека, который должен быть нечувствительным к регистру и, вероятно, также поддерживать нечеткий поиск).
хороший момент, в том числе toLowerCase()
перед includes
, вероятно, подойдет
Однако такое использование toLowerCase
не далеко от идеала... это приведет к большому (относительно дорогому) выделению строк....
@Dai Я обновил ответ, чтобы использовать регулярное выражение и match
let articles = [ {
"id": "35",
"matchcode": "KM Anteile S",
"description": "KM Anteile S ",
"unit": "STK",
"salesPrice": 0.7,
"stock": "HL-F",
"stockAmount": -3282
},
{
"id": "41",
"matchcode": "Arbeitszeit",
"description": "Arbeitszeit ",
"unit": "STD",
"salesPrice": 76.8,
"stock": "HL-F",
"stockAmount": 0.75
}, {
"id": "502019",
"matchcode": "Gummimuffe 100 mm",
"description": "Gummimuffe 100 mm ",
"unit": "STK",
"salesPrice": 9.8,
"stock": "HL-F",
"stockAmount": 15
}];
let articleno = "Gummimuffe"
let search = articles.filter(function(item){
return (item.matchcode.includes(articleno) || item.description.includes(articleno) || item.id.includes(articleno))
})
console.info(search)
Это пример примера, который вы также можете применить к своему коду.
let arr = JSON.parse('[{"value":"This is object insided array"}]');
console.info(arr)
articles
— это строка. Вам нужноJSON.parse()
это.