Объект фильтра JS, который включает в себя массив

Я попытался отфильтровать объект 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 — это строка. Вам нужно JSON.parse() это.
Rocket Hazmat 22.03.2022 15:37

Ваше значение articles представляет собой (синтаксически неверный) нить, а не object-граф. Вам нужно сначала запустить его JSON.parse. Кроме того, строки JS, использующие одинарные ' или двойные кавычки ", не могут содержать буквальные символы новой строки, если только они не являются шаблонными строками (обратными кавычками), но ваше значение let articles использует одинарные кавычки. и содержит буквальные символы новой строки, которые просто не запустятся, потому что парсер отвергнет это.

Dai 22.03.2022 15:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно закрыть [ с помощью ], и у вас есть строка, а не массив объектов. Вы также можете использовать 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 чувствителен к регистру, что, вероятно, не то, чего хочет ОП (поскольку похоже, что они хотят выполнять поиск, удобный для человека, который должен быть нечувствительным к регистру и, вероятно, также поддерживать нечеткий поиск).

Dai 22.03.2022 15:56

хороший момент, в том числе toLowerCase() перед includes, вероятно, подойдет

dippas 22.03.2022 16:00

Однако такое использование toLowerCase не далеко от идеала... это приведет к большому (относительно дорогому) выделению строк....

Dai 22.03.2022 16:01

@Dai Я обновил ответ, чтобы использовать регулярное выражение и match

dippas 22.03.2022 16:11
Ответ принят как подходящий

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)

Другие вопросы по теме