Фильтр по массиву объектов и foreach для второго массива для условий - PullRequest
0 голосов
/ 25 июня 2018

Через несколько часов я натолкнулся на недоумение - интересно, может ли новичок-разработчик просто просмотреть нижеприведенный код, чтобы упростить решение проблемы?

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

Однако мой результат возвращает все 3 объекта, несмотря на консоль.журнал вроде бы правильно оценил.Есть идеи?

Большое спасибо ...

var data = [{
    "id": 1,
    "status": "new",
  },
  {
    "id": 2,
    "status": "rejected",
  },
  {
    "id": 3,
    "status": "changed",
  }
];

var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter(function(item) {
  var arr = [];

  Object.keys(filter).forEach(function(key) {
    if (item.status === key && filter[key] === true) {

      console.log('---')
      console.log('item.status', item.status)
      console.log('key', key)
      console.log('filter[key]', filter[key])
      console.log('---')

      arr.push(item);
    }
  });

  return arr;
});

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Вы делаете это немного сложнее, чем нужно.Функция, переданная в filter(), должна возвращать логическое значение - вы возвращаете массив.

Вы можете просто отфильтровать с помощью поиска в массиве filter, который либо вернет false или undefined, в этом случае вы отфильтруете его, либо true, в этом случае вы сохранитеэто ..

var data = [{
    "id": 1,
    "status": "new",
  },
  {
    "id": 2,
    "status": "rejected",
  },
  {
    "id": 3,
    "status": "changed",
  }
];

var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter(item => filter[item.status])

console.log(result)
0 голосов
/ 25 июня 2018

filter создаст новый массив с каждым item, который вернул истинное значение. Это должно работать:

var result = data.filter(function(item) {
  return filter[item.status];
});
0 голосов
/ 25 июня 2018

Вы filter, возвращая что-то правдивое или ложное напрямую, а не возвращая что-то более конкретное (например, объект).Вы можете упростить свой код до одной строки:

var data=[{"id":1,"status":"new",},{"id":2,"status":"rejected",},{"id":3,"status":"changed",}]
var filter = {
  "new": true,
  "rejected": false,
  "changed": true
}

var result = data.filter((item) => filter[item.status])
console.log(result);
...