фильтровать данные JSON по нескольким ключам - PullRequest
0 голосов
/ 04 сентября 2018

Мои данные JSON здесь

 [
   {
      "id":"13167",
      "photo_cd":"9946",
      "src":"",
      "price":"5990",
      "hf_section":"1",
      "sell_price":"6469",
      "design_id":"1",
      "genre_id":"1",
      "color_id":"1"
   },
   {
      "id":"13166",
      "photo_cd":"9945",
      "src":"",
      "price":"5990",
      "hf_section":"1",
      "sell_price":"6469",
      "design_id":"3",
      "genre_id":"1",
      "color_id":"1"
   },
   {
      "id":"13165",
      "photo_cd":"9944",
      "src":"",
      "price":"5990",
      "hf_section":"1",
      "sell_price":"6469",
      "design_id":"1",
      "genre_id":"1",
      "color_id":"4"
   },
   {
      "id":"13164",
      "photo_cd":"9943",
      "src":"",
      "price":"6990",
      "hf_section":"1",
      "sell_price":"7549",
      "design_id":"2",
      "genre_id":"3",
      "color_id":"3"
   }
]

Мой парам нравится

["", "2", "1", "0", "0", "0"]

Мой JS здесь

 $.getJSON(
      filepath,
      function(data) {
    var keys = [];
    var values = [];
     if (param[1] != 0) {
      keys.push("hf_section");
      values.push(param[1]);

     }
     if (param[2] != 0) {
      keys.push("design_id");
      values.push(param[2]);

     }
     if (param[3] != 0) {
      keys.push("genre_id");
      values.push(param[3]);
     }
     if (param[4] != 0) {
      keys.push("color_id");
      values.push(param[4]);
     }
     if (param[5] != 0) {
      keys.push("price");
      values.push(param[5]);
     }
    var result = data.filter(function(e) {
      return keys.every(function(a) {
        return values.includes(e[a])
      })
    })
  })

Я хочу отфильтровать все параметры с условием AND. теперь он работает как ИЛИ

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я предполагаю, что вы хотите фильтровать, используя param в качестве списка значений полей в следующем порядке: hf_section, design_id, genre_id, color_id, price.

Я предполагаю, что когда параметр [n] равен 0, значение поля следует игнорировать.

В этом случае мы можем попробовать этот подход:

let testData = [{ id: "13167", photo_cd: "9946", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "1", genre_id: "1", color_id: "1" }, { id: "13166", photo_cd: "9945", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "3", genre_id: "1", color_id: "1" }, { id: "13165", photo_cd: "9944", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "1", genre_id: "1", color_id: "4" }, { id: "13164", photo_cd: "9943", src: "", price: "6990", hf_section: "1", sell_price: "7549", design_id: "2", genre_id: "3", color_id: "3" }];
let fields = ["photo_cd", "hf_section", "design_id", "genre_id", "color_id", "price"];

function filterDataItems(data, filterParams) {
    return data.filter(item => {
        return fields.every((fieldName, index) => {
            return filterParams[index] == 0 || (item[fieldName] == filterParams[index]);
        });
    });
}

console.log('Test 1: ', filterDataItems(testData, ["9946", "1", "1", "1", "0", "5990"]));
console.log('Test 2: ', filterDataItems(testData, ["0", "0", "0", "0", "4", "0"]));
console.log('Test 3: ', filterDataItems(testData, ["0", "0", "0", "0", "0", "0"]));
console.log('Test 4: ', filterDataItems(testData, ["0", "0", "0", "0", "0", "0"]));
0 голосов
/ 04 сентября 2018

Предлагаю использовать объект

filter = {
    hf_section: '2',
    design_id: '1',
    genre_id: '0',
    color_id: '0', 
    price: '0'
}

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

Тогда вы можете отфильтровать ключи, чтобы получить только желаемый результат.

Фильтрация ключей и объектов может быть проще, если вы берете числа вместо строк для сравнения.

var data = [{ id: "13167", photo_cd: "9946", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "1", genre_id: "1", color_id: "1" }, { id: "13166", photo_cd: "9945", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "3", genre_id: "1", color_id: "1" }, { id: "13165", photo_cd: "9944", src: "", price: "5990", hf_section: "1", sell_price: "6469", design_id: "1", genre_id: "1", color_id: "4" }, { id: "13164", photo_cd: "9943", src: "", price: "6990", hf_section: "1", sell_price: "7549", design_id: "2", genre_id: "3", color_id: "3" }],
    items = ["", "2", "1", "0", "0", "0"],
    filter = { hf_section: '2', design_id: '1', genre_id: '0', color_id: '0', price: '0' },
    keys = Object.keys(filter).filter(k => +filter[k]),
    result = data.filter(o => keys.every(k => o[k] == filter[k]));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...