国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

JS實(shí)現數組過(guò)濾從簡(jiǎn)單到多條件篩選

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:程序員安妮 欄目: JavaScript 歡迎投稿:712375056

目錄

在上家公司工作的時(shí)候,有一個(gè)需求是在前端部分完成篩選功能,一次拿到所有數據,然后根據條件篩選。通常情況下篩選是后臺給接口,在數據量不大的情況下,也有人可能會(huì )遇到前端篩選這樣的情況,特別寫(xiě)了這篇文章分享給大家,有問(wèn)題請指出,互相學(xué)習。

一般情況下的單條件篩選,數組的filter方法就能夠滿(mǎn)足需求,本文討論的重點(diǎn)是多條件下的復合篩選,并列出了幾個(gè)相關(guān)知識點(diǎn)。

以下是很多個(gè)🌰🌰🌰🌰

// 這個(gè)是例子中的被篩選數組
var aim = [
    {name:'Anne', age: 23, gender:'female'},
    {name:'Leila', age: 16, gender:'female'},
    {name:'Jay', age: 19, gender:'male'},
    {name:'Mark', age: 40, gender:'male'}
]

單條件單數據篩選

根據單個(gè)名字篩選,用filter方法,判斷name是否為目標名字即可

// 根據單個(gè)名字篩選
function filterByName(aim, name) {
    return aim.filter(item => item.name == name)
}
// 輸入 aim 'Leila' 期望輸出為 [{name:'Leila', age: 16, gender:'female'}]
console.log(filterByName(aim,'leila'))

單條件多數據篩選

根據多個(gè)名字篩選,這里是用for循環(huán)遍歷目標數組,然后用find方法找到后push到結果數組里,用find方法是重名情況下也能得到想要的結果。for循環(huán)可以用數組的一些遍歷方法替代,代碼可以更簡(jiǎn)化,示例就是大概表達個(gè)意思。

// 根據多個(gè)名字篩選
function filterByName1(aim, nameArr) {
    let result = []
    for(let i = 0; i < nameArr.length; i++) {
        result.push(aim.find(item => item.name = nameArr[i]))
    }
    return result
}
// 輸入 aim ['Anne','Jay'] 
//期望輸出為 [{name:'Anne', age: 23, gender:'female'},{name:'Jay', age: 19, gender:'male'}]
console.log(filterByName1(aim,['Leila','Jay']))
// 有BUG 改進(jìn)后

多條件單數據篩選

根據單個(gè)名字或者單個(gè)年齡篩選,用filter方法,判斷條件之間是或的關(guān)系。

// 根據名字或者年齡篩選
function filterByName2(aim, name, age) {
    return aim.filter(item => item.name == name || item.age == age)
}
console.log(filterByName2(aim,'Leila',19))

多條件多數據篩選

我最初是用了很笨的雙for循環(huán)去做,發(fā)現很慢,而且并沒(méi)有達到預期的效果。具體的心路歷程已經(jīng)太遙遠,簡(jiǎn)單介紹以下這個(gè)篩選算法。
首先是把篩選條件都塞到一個(gè)對象里,用object對象的keys方法獲取到篩選的條件名,及需要篩選的是哪個(gè)條件,是name?age? gender?
然后使用filter方法對目標數據進(jìn)行篩選,🌰如下⬇️
根據名字和年齡多元素篩選

//根據名字和年齡多元素篩選
export function multiFilter(array, filters) {
  const filterKeys = Object.keys(filters)
  // filters all elements passing the criteria
  return array.filter((item) => {
    // dynamically validate all filter criteria
    return filterKeys.every(key => {
        //ignore when the filter is empty Anne
      if(!filters[key].length) return true
      return !!~filters[key].indexOf(item[key])
    })
  })
}
/*
 * 這段代碼并非我原創(chuàng  ),感興趣的可以去原作者那里點(diǎn)個(gè)贊
 * 作者是:@author https://gist.github.com/jherax
 * 這段代碼里我只加了一行,解決部分篩選條件清空時(shí)候整體篩選失效的問(wèn)題
 */

var filters = {
    name:['Leila', 'Jay'],
    age:[]
}
/* 結果:
 * [{name: "Leila", age: 16, gender: "female"},
 *  {name: "Jay", age: 19, gender: "male"}]
 */

例如這里,判斷每條數據的name值是否在filters.name數組里,是的話(huà)返回true,判斷filters.age是空數組的話(huà)直接返回true,空數組是模擬了age條件被清空的情況,我們仍然能得到正確的篩選數據。

知識點(diǎn)1: Object.key() 獲取數組索引或者對象屬性

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); 
// ["0", "1", "2"]


var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); 
// ["0", "1", "2"]


var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); 
// ["2", "7", "100"] 猜猜為啥?

知識點(diǎn)2: js里的falsy

falsy : 0 , false, "", null, undefined, NaN

在判斷語(yǔ)句中,只有上面6種情況會(huì )是false,其余的都是true

var a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
    //a有內容才執行的代碼  
}

if(!!a){
    //a有內容才執行的代碼...  
}

知識點(diǎn)3: Array.every 與 Array.some的區別

我的理解是在遍歷數組的時(shí)候:

  • Array.every的條件是「與」的關(guān)系,全真為真,及條件全為true則為true,有一個(gè)false就返回false
  • Array.some的條件是「或」的關(guān)系,有真為真,條件有一個(gè)true就返回true,條件全為false的時(shí)候才返回false

下面舉個(gè)🌰

// 判斷每個(gè)名字都為Anne?
let dataEvery = aim.every(item => item.name === 'Anne') // false
let dataEvery = aim.some(item => item.name === 'Anne') // true

// 判斷每個(gè)名字都是字符串?
let dataEvery = aim.every(item => typeof item.name === 'string') // true
let dataEvery = aim.some(item => typeof item.name === 'string') // true

知識點(diǎn)4: 數組的深拷貝與淺拷貝

最近參與一些前端的面試工作,深拷貝與淺拷貝是我最?lèi)?ài)問(wèn)的問(wèn)題之一。一個(gè)問(wèn)題就考察了數據類(lèi)型,數組操作,遞歸算法等。

因為數組是js里的引用類(lèi)型,單純復制時(shí)復制的是其引用關(guān)系。在對獲取的數據進(jìn)行篩選時(shí),我并不希望影響原始數據,所以我要用到「深拷貝」得到與原始數據數據結構完全相同又相互獨立的數據,而不是只復制其引用關(guān)系。

// 我常用方法,如果項目很大,不推薦
let obj1 = JSON.parse(JSON.stringify(obj))

// deepclone
function deepClone(o1, o2) {
    for (let k in o2) {
        if (typeof o2[k] === 'object') {
            o1[k] = {};
            deepClone(o1[k], o2[k]);
        } else {
            o1[k] = o2[k];
        }
    }
}

想一想:遞歸算法的優(yōu)化

這個(gè)知識點(diǎn)與本文關(guān)系不大。😄 抱歉之前的誤導。

這個(gè)是看掘金小冊前端面試指南看到的,講算法的時(shí)候提了一下遞歸算法的優(yōu)化,初見(jiàn)的時(shí)候又被驚艷到,還沒(méi)有在項目里用到。感興趣的可以試試,這個(gè)是斐波那契數列和??梢宰约涸跒g覽器里敲一下,試試不用緩存與用緩存的運算次數差別。

let count = 0;
function fn(n) {
    let cache = {};
    function _fn(n) {
        if (cache[n]) {
            return cache[n];
        }
        count++;
        if (n == 1 || n == 2) {
            return 1;
        }
        let prev = _fn(n - 1);
        cache[n - 1] = prev;
        let next = _fn(n - 2);
        cache[n - 2] = next;
        return prev + next;
    }
    return _fn(n);
}

let count2 = 0;
function fn2(n) {
    count2++;
    if (n == 1 || n == 2) {
        return 1;
    }
    return fn2(n - 1) + fn2(n - 2);
}

到此這篇關(guān)于JS實(shí)現數組過(guò)濾從簡(jiǎn)單到多條件篩選的文章就介紹到這了,更多相關(guān)JS 數組過(guò)濾內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

国产成人美女视频网站| 久久精品免费一区二区| 日文乱码一二三四| 国产在线午夜卡精品影院| 国内极度色诱视频网站| 999久久久免费精品播放|