Фильтровать массив и сопоставить хотя бы одно условие - PullRequest
1 голос
/ 27 июня 2019

Я бы хотел решить следующую проблему: я хотел бы отфильтровать массив по определенным условиям с помощью Vue.js и lodash (или чистого JavaScript).

Мои объекты

  • Я получил список Items.Каждый элемент содержит (необязательно) categories.
  • Объект Car может иметь category.

Массив объектов Items

"data": [
    {
      "id": 1,
      "title": "Item 1",
      "categories": [
        {
          "id": 4,
          "title": "category 4",
          "description": "",
        },
        {
          "id": 5,
          "title": "category 5",
          "description": "",
        }
      ]
    },
    {
      "id": 2,
      "title": "Item 2",
      "categories": []
    },
    {
      "id": 3,
      "title": "Item 3",
      "categories": []
    }
  ]

Объект Car

{
  "category": {
    "id": 5,
    "title": "category 5",
    "description": ""
  },
  "title": "Test"
}

Моя цель

Я хотел бы показать только те Items, которые соответствуют хотя бы одному из этих правил:

  • TheItem имеет по крайней мере один category, который соответствует category из Car
  • . Item имеет no category set

Мой подход

Я использую значение computed для фильтрации this.items:

computed: {
        filteredItems: function () {
            let vm = this;
            return _.filter (this.items, function (item) {
                return _.includes (item.categories, vm.car.category );
            });
        }
    },

Текущий результат:

filteredItems всегда пусто.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Вам нужно сделать еще один уровень проверки на categories, потому что вам нужно проверить каждый предмет внутри него. С обычным javascript вы можете сделать это с some(), который будет возвращать true, если какой-либо из элементов соответствует.

let data = [{"id": 1,"title": "Item 1","categories": [{"id": 4,"title": "category 4","description": "",},{"id": 5,"title": "category 5","description": "",}]},{"id": 2,"title": "Item 2","categories": []},{"id": 3,"title": "Item 3","categories": []}]
let  car = {"category": {"id": 5,"title": "category 5","description": ""},"title": "Test"}

let filtered = data.filter(item => !item.categories || item.categories.length === 0 ||  item.categories.some(cat=> cat.id === car.category.id))
console.log(filtered)
1 голос
/ 27 июня 2019

С lodash вам нужно что-то вроде

result = _.filter(data, ({categories}) =>
    _.isEmpty(categories) ||
    _.some(categories, cat => cat.id === car.category.id))

Если вы хотите сравнить целые объекты категории, а не только идентификаторы, то

_.filter(data, ({categories}) => 
    _.isEmpty(categories) || 
    _.some(categories, cat => _.isEqual(cat, car.category)
    ))
...