Saya memiliki banyak koleksi data 700+ item, dan saya ingin memfilter menurut array objek dinamis, katakanlah pengguna telah mengetik ode dan skrip saya harus mencari di setiap filter tanpa saya melakukan sesuatu seperti filter.code == store.code

const hugeData = [{name:"store 1",code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true},{name : "sto 3",code : "has no cde",available : true}...]

const filters = [{ code : "ode", name : "re" }]

Hasil yang saya harapkan adalah

// output
[{name : "store 1", code : "code 1", available : false},{name : "store 2",code : "simple_code",available : true}]

Saya menyelesaikan ini dengan melakukan hal berikut dengan lodash, tetapi fungsinya sangat lambat, dan kodenya buruk, apakah ada cara lain agar saya dapat melakukan ini?

const results = []
_.map(hugeData, store => {
    _.map(filters, tag => {
        Object.keys(tag).map(tagOb => {
          if (store[tagOb] && store[tagOb].includes(tag[tagOb])) {
             results.push(store);
          }
        });
    });
});
1
Dante Cervantes 27 Oktober 2019, 05:56

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan filter dan some

const hugeData = [{ name: "store 1", code: "code 1",available: false}, { name: "store 2", code: "simple_code",available: true}, { name: "sto 3", code: "has no cde", available: true }]

const filters = { code: "ode", name: "re" }

let final = hugeData.filter(value => {
  return Object.entries(value).some(([key, value]) => {
    return typeof value == 'string' && value.includes(filters[key])
  })
})

console.log(final)
3
Code Maniac 27 Oktober 2019, 03:10

Ini mungkin lebih cepat - menyimpan hasil Object.keys(), dan memfilter kunci apa pun yang tidak ada di toko pertama (dengan asumsi semua toko setara). Saya juga menggunakan satu objek untuk filters.

const hugeData = [
  { name: "store 1", code: "code 1", available: false },
  { name: "store 2", code: "simple_code", available: true },
  { name: "sto 3", code: "has no cde", available: true }
];

const filters = { code: "ode", name: "re" };
const keys = Object.keys(filters).filter(k => hugeData[0].hasOwnProperty(k));

console.log(
  hugeData.filter(s => keys.some(k => s[k].includes(filters[k])))
);

Jika Anda ingin SEMUA filter, untuk dicocokkan, Anda dapat mengubahnya menjadi every:

hugeData.filter(s => keys.every(k => s[k].includes(filters[k])))
1
Anthony 27 Oktober 2019, 03:14