亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找多個JavaScript數組之間的匹配項

查找多個JavaScript數組之間的匹配項

查找多個JavaScript數組之間的匹配項我有多個帶有字符串值的數組,我想比較它們,只保留所有數組之間相同的匹配結果。鑒于此示例代碼:var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];var arr2 = ['taco', 'fish', 'apple', 'pizza'];var arr3 = ['banana', 'pizza', 'fish', 'apple'];我想生成以下包含所有給定數組的匹配的數組:['apple', 'fish', 'pizza']我知道我可以組合所有數組,var newArr = arr1.concat(arr2, arr3);但只是給我一個包含所有數據的數組,以及重復數據。這可以輕松完成,而不需要像underscore.js這樣的庫的開銷嗎?(太好了,現在我也餓了!)編輯我想我應該提到可能有一個未知數量的數組,我只是以3為例。
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

現在,您已經在問題中添加了不確定數量的數組,這是另一種方法,它將每個項目的計數收集到一個對象中,然后整理具有最大計數的項目。

這種方法的優點:

  1. 如果數組較大,那么強力搜索選項(由其他答案使用)的速度要快15倍

  2. 不需要ES5或ES5墊片(適用于所有瀏覽器)

  3. 完全非破壞性(根本不改變源數據)

  4. 處理源數組中的重復項

  5. 處理任意數量的輸入數組

這是代碼:

function containsAll(/* pass all arrays here */) {
    var output = [];
    var cntObj = {};
    var array, item, cnt;
    // for each array passed as an argument to the function
    for (var i = 0; i < arguments.length; i++) {
        array = arguments[i];
        // for each element in the array
        for (var j = 0; j < array.length; j++) {
            item = "-" + array[j];
            cnt = cntObj[item] || 0;
            // if cnt is exactly the number of previous arrays, 
            // then increment by one so we count only one per array
            if (cnt == i) {
                cntObj[item] = cnt + 1;
            }
        }
    }
    // now collect all results that are in all arrays
    for (item in cntObj) {
        if (cntObj.hasOwnProperty(item) && cntObj[item] === arguments.length) {
            output.push(item.substring(1));
        }
    }
    return(output);}

工作演示:http//jsfiddle.net/jfriend00/52mAP/

僅供參考,這不需要ES5,因此可以在沒有墊片的情況下在所有瀏覽器中使用。

在每1000個長15個陣列的性能測試中,這比我在jsperf中使用的搜索方法快了10倍以上:http://jsperf.com/in-all-arrays 。


這是一個使用ES6 MapSet進行重復數據刪除和跟蹤計數的版本。這樣做的優點是數據類型可以保留并且可以是任何東西(它甚至不需要進行自然的字符串轉換,數據甚至可以是對象,盡管對象是完全相同的對象,而不是相同的對象屬性/值)。

var arrays = [
    ['valueOf', 'toString','apple', 'orange', 'banana', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza', 1, 2, 999, 888],
    ['valueOf', 'toString','taco', 'fish', 'fish', 'apple', 'pizza', 1, 999, 777, 999, 1],
    ['valueOf', 'toString','banana', 'pizza', 'fish', 'apple', 'apple', 1, 2, 999, 666, 555]
    ];
    // subclass for updating cnts    class MapCnt extends Map {
    constructor(iterable) {
        super(iterable);
    }
    
    cnt(iterable) {
        // make sure items from the array are unique
        let set = new Set(iterable);
        // now update the cnt for each item in the set
        for (let item of set) {
            let cnt = this.get(item) || 0;
            ++cnt;
            this.set(item, cnt);
        }
    }}function containsAll(...allArrays) {
    let cntObj = new MapCnt();
    for (array of allArrays) {
        cntObj.cnt(array);
    }
    // now see how many items have the full cnt
    let output = [];
    for (var [item, cnt] of cntObj.entries()) {
        if (cnt === allArrays.length) {
            output.push(item);
        }
    }
    return(output);}    var result = containsAll.apply(this, arrays);document.body.innerHTML = "<pre>[<br>    " + result.join(',<br>    ') + "<br>]</pre>";



查看完整回答
反對 回復 2019-08-02
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

假設有一組數組我們想要找到它們的交集,那么最簡單的單線程方法就可以了


var arr = [[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8],[4,5,6,7]],
    int = arr.reduce((p,c) => p.filter(e => c.includes(e)));document.write("<pre>" + JSON.stringify(int) + "</pre>");


查看完整回答
反對 回復 2019-08-02
  • 3 回答
  • 0 關注
  • 1027 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號