Фильтрация массива объектов с несколькими свойствами, которые становятся пустыми в результате - PullRequest
0 голосов
/ 22 июня 2019

Вот моя попытка получить результат с несколькими свойствами.но получая всегда пустой массив как результат.

Кто-нибудь показать мне правильный и минимальный подход здесь?У меня тоже нет разных критериев фильтрации ..

nestedFilter = (targetArray, filters) => {
          var filterKeys = Object.keys(filters);
          return targetArray.filter(function (eachObj) {
            return filterKeys.every(function (eachKey) {
              return filters[eachKey].includes(eachObj[eachKey]);
           });
       });
    };

//filter 1    
let filter1 = {
  color: "Blue",
  size:'70'
};
//filter 2
let filter2 = {
  name:'',
  color: "Blue",
  size:'70'
};

//filter 3
let filters = {
    name:'',
  color: "",
  size:''
};


let products = [
  { name: "A", color: "Blue", size: 50 },
  { name: "B", color: "Blue", size: 60  },
  { name: "C", color: "Black", size: 70 },
  { name: "D", color: "Green", size: 50 },
];

var results = nestedFilter(products, filter2);

console.log(results); //getting alwasy empty.

Демо здесь

Ответы [ 3 ]

0 голосов
/ 22 июня 2019

Вы должны использовать some, а не every. Также обратите внимание, что вы можете воспользоваться вложенными возвратами и другими функциями, чтобы сделать ваш код более кратким.

const nestedFilter = (targetArray, filters) => targetArray.filter(o => Object.keys(filters).some(k => filters[k].includes(o[k]) || filters[k] == ""));
 
let filter1 = {color:"Blue",size:'70'};
let filter2 = {name:'',color:"Blue",size:'70'};
let filters = {name:'',color:"",size:''};
let products = [{name:"A",color:"Blue",size:50},{name:"B",color:"Blue",size:60},{name:"C",color:"Black",size:70},{name:"D",color:"Green",size:50},];

console.log(nestedFilter(products, filter1));
console.log(nestedFilter(products, filter2));
console.log(nestedFilter(products, filters));
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 22 июня 2019

Вы можете решить эту проблему также с помощью Object.entries и Array.filter и Array.some , например:

let products = [
  { name: "A", color: "Blue", size: 50 },
  { name: "B", color: "Blue", size: 60  },
  { name: "C", color: "Black", size: 70 },
  { name: "D", color: "Green", size: 50 },
];

let filter1 = { color: 'Blue', size:  '70' }
let filter2 = { name:  '', color: 'Blue', size:  '60' }
let filter3 = { name:  '', color: '', size:  '' }

let nestedFilter = (arr, filter) => {
  let fE = Object.entries(filter)
  return arr.filter(f => fE.some(([k,v]) => !v || f[k].toString().includes(v)))
}

console.log(nestedFilter(products, filter1))  // 3 objects
console.log(nestedFilter(products, filter2))  // 4 objects
console.log(nestedFilter(products, filter3))  // 4 objects

Идея состоит в том, чтобы получить entries фильтра, с которым вы работаете, а затем использовать его ключ / значение, чтобы проверить, если сначала нет значения, равного true для нас (нам нужны записи, ключ фильтра которых совпадает с пустой строкой) и если фактическое значение соответствует значению текущего ключа отфильтрованного объекта.

0 голосов
/ 22 июня 2019

Вы должны использовать некоторые из них, если хотите, чтобы продукт был включен в вывод, если какое-либо одно значение соответствует

let products = [{name: "A",color: "Blue",size: 50},{name: "B",color: "Blue",size: 60},{name: "C",color: "Black",size: 70},{name: "D",color: "Green",size: 50},];


let filter1 = {color: "Blue",size: '70'};
let filter2 = {name: '',color: "Blue",size: '70'};
let filters = {name: '',color: "",size: ''};

const nestedFilter = (targetArray, filters) => {
  var filterKeys = Object.keys(filters);
  return targetArray.filter(function(eachObj) {
    return filterKeys.some(function(eachKey) {
      return filters[eachKey].includes(eachObj[eachKey]);
    });
  });
};


console.log(nestedFilter(products, filter1))
console.log(nestedFilter(products, filter2))
console.log(nestedFilter(products, filters))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...