Используйте словарь для фильтрации объекта данных javascript

Скажем, у меня есть фильтр:

filter = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]

Я хочу отфильтровать следующий объект javascript с указанными выше условиями фильтрации:

var data = [
{title: "The Uncertainty of the Poet ",
pl: 3,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 2,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 4,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
...
]

Я безуспешно пробовал следующее:

var result = data.filter(function(d){
            for (item in filter) {
                return d.key==d.value;
            }

каков ваш ожидаемый результат? Вы хотите вернуть весь объект, если фильтр соответствует?

V. Sambor 03.08.2018 00:49

Я хочу вернуть объект только с записями, соответствующими условиям фильтра

Emily Chu 03.08.2018 00:56
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
1 519
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы недостаточно углубляетесь в свой for in. Он перебирает массив и не работает с каждым объектом в массиве

Можно использовать Array#every(), чтобы убедиться, что каждый объект в массиве фильтров соответствует объекту данных

// filter main data
var result = data.filter(function(dataObj){
   // check if all proprties within filter array are a match
   return filter.every(function(filterObj){
      //compare value of property found in filterObject with value 
      return dataObj[filterObj.key] === filterObj.value
   })
})

console.info(result)
<script>
var filter = [ {key: "pl", value: 2}, {key: "sh", value: 3} ]

var data = [{
    title: "The Uncertainty of the Poet ",
    pl: 2,
    si: 2,
    va: 3,
    te: 0,
    co: 0,
    or: 4,
    sh: 3,
    po: 0,
    li: 0,
    ar: 5
  },
  {
    title: "Direction",
    pl: 4,
    si: 3,
    va: 1,
    te: 3,
    co: 0,
    or: 3,
    sh: 2,
    po: 0,
    li: 0,
    ar: 5
  }
 
]
</script>

Думаю, нам на всякий случай может потребоваться проверить, существует ли эта собственность. Что-то вроде dataObj [filterObj.key] && dataObj [filterObj.key] === filterObj.value

Saturn K 03.08.2018 01:04

@KeyvanSadralodabai, если он не существует, будет просто === undefined и не будет совпадать или выдавать ошибку

charlietfl 03.08.2018 01:05

@KeyvanSadralodabai Простой пример var foo = {a:1}; console.info(foo.bar)//undefined

charlietfl 03.08.2018 01:09

Да, я это уже тестировал. Я удалил свой ответ, так как он не добавляет ничего полезного.

Saturn K 03.08.2018 01:10

@KeyvanSadralodabai будет проблематично, только если будут задействованы вложенные свойства

charlietfl 03.08.2018 01:10

Если вы хотите, чтобы он совпадал с одним или другим значением, это сработает:

match = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]

var result = data.filter(function(d) {
    return d.pl === match[0]['value'] || d.sh === match[1]['value']
})

Я изменил имя массива на match, чтобы избежать путаницы.

Что делать, если массив фильтров имеет 3 (или более) элемента и ключи в каждом из его объектов неизвестны?

charlietfl 03.08.2018 00:50
Ответ принят как подходящий

Еще один потенциальный вариант проверить, соответствует ли объект всем критериям:

data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a && (obj[f.key] === f.value);
    }, true);
});

Это будет работать без проверки hasOwnProperty из-за использования уменьшать. Если вы хотите проверить, выполняется ли какое-либо из условий фильтра, вы должны изменить его на

data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a || (obj[f.key] === f.value);
    }, false);
});

Спасибо, sbrass. Первый сработал так, как я надеялся. Поскольку мои условия фильтрации обновляются динамически, он возвращает объект данных с записями, которые удовлетворяют всем выбранным условиям и хранятся в фильтре.

Emily Chu 03.08.2018 01:05

Вы также можете сделать это:

var filters = [{key: "pl", value: 3}, {key: "sh", value: 2}]

var data = [
    {
        title: "The Uncertainty of the Poet ",
        pl: 2,
        si: 2,
        va: 3,
        te: 0,
        co: 0,
        or: 4,
        sh: 3,
        po: 0,
        li: 0,
        ar: 5
    },
    {
        title: "Direction",
        pl: 3,
        si: 3,
        va: 1,
        te: 3,
        co: 0,
        or: 3,
        sh: 2,
        po: 0,
        li: 0,
        ar: 5
    }
]

var result = data.filter((item) => {
  for(let i = 0; i < filters.length; ++i) {
    let filter = filters[i];

    if (item[filter.key] && item[filter.key] === filter.value) {
      return true;
    }
  }

  return false;
});

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