簡體   English   中英

使用jQuery或JavaScript過濾數組與另一個數組

[英]Filter array with another array with jQuery or JavaScript

我試圖用'outputdata'另一個數組中的鍵值過濾數組'arrSOPrecods'。 第一個數組'arrSOPrecods'包含用於為特定SOP訓練的用戶的記錄第二個數組'outputdata'包含已經針對特定SOP訓練的用戶的記錄我將需要過濾掉arrSOprecords中outputdata中存在的記錄。 我已經嘗試了許多不同的方法,例如jQuery過濾器,JavaScript for循環以及它自己的.filter函數,幾乎沒有進展但沒什么用處。 這里是數據的示例以及最終輸出應該是什么。

var arrSOPrecords = [
    { User: "Cesar", SOP: "training 1" },
    { User: "Cesar", SOP: "training 2" },
    { User: "Jon", SOP: "training 1" },
    { User: "Jon", SOP: "training 2" },
    { User: "Ana", SOP: "training 1" },
    { User: "Ana", SOP: "training 2" }
];

var outputdata = [
    { User: "Cesar", SOP: "training 1" }, 
    { User: "Cesar", SOP: "training 2" }, 
    { User: "Ana", SOP: "training 1" }, 
    { User: "Jon", SOP: "training 1" }
];

最終的輸出數組。

var filtered = [
    { User: "Ana", SOP: "training 2" },
    { User: "Jon", SOP: "training 2" }
];

您可以為項目使用哈希表,您要排除並過濾記錄。

 var arrSOPrecords = [{ User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Jon", SOP: "training 1" }, { User: "Jon", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Ana", SOP: "training 2" }], outputdata = [{ User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Jon", SOP: "training 1" }], filtered, hash = Object.create(null); outputdata.forEach(function (a) { hash[a.User + '|' + a.SOP] = true; }); filtered = arrSOPrecords.filter(function (a) { return !hash[a.User + '|' + a.SOP]; }); console.log(filtered); 

您可以在兩個數組上使用map()並返回User + SOP字符串,然后使用indexOf()進行過濾

 var arrSOPrecords=[{User:"Cesar", SOP:"training 1"},{User:"Cesar", SOP:"training 2"},{User:"Jon", SOP:"training 1"},{User:"Jon", SOP:"training 2"},{User:"Ana", SOP:"training 1"},{User:"Ana", SOP:"training 2"}]; var outputdata= [{User:"Cesar", SOP:"training 1"},{User:"Cesar", SOP:"training 2"},{User:"Ana", SOP:"training 1"},{User:"Jon", SOP:"training 1"}] var a = arrSOPrecords.map(e => e.User+e.SOP); var b = outputdata.map(e => e.User+e.SOP); var result = arrSOPrecords.filter(function(e, i) { return b.indexOf(a[i]) == -1; }); console.log(result) 

更新 :您實際上只需在第二個數組上使用map ,然后使用這樣的過濾器

 var arrSOPrecords = [{ User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Jon", SOP: "training 1" }, { User: "Jon", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Ana", SOP: "training 2" }]; var outputdata = [{ User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Jon", SOP: "training 1" }]; var a = outputdata.map(e => e.User+e.SOP); var result = arrSOPrecords.filter(function(el) { return a.indexOf(el.User+el.SOP) == -1; }) console.log(result) 

Array.prototype.filter() + Array.prototype.some()

 var arrSOPrecords = [ { User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Jon", SOP: "training 1" }, { User: "Jon", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Ana", SOP: "training 2" } ]; var outputdata = [ { User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Jon", SOP: "training 1" } ]; var filtered = arrSOPrecords.filter(function(r) { return !outputdata.some(function(t) { return r.User === t.User && r.SOP === t.SOP; }); }); console.log(JSON.stringify(filtered)); 

您可以嘗試使用array.some方法過濾第一個數組:

 var arrSOPrecords=[{User:"Cesar", SOP:"training 1"},{User:"Cesar", SOP:"training 2"},{User:"Jon", SOP:"training 1"},{User:"Jon", SOP:"training 2"},{User:"Ana", SOP:"training 1"},{User:"Ana", SOP:"training 2"}]; var outputdata= [{User:"Cesar", SOP:"training 1"},{User:"Cesar", SOP:"training 2"},{User:"Ana", SOP:"training 1"},{User:"Jon", SOP:"training 1"}] var r = arrSOPrecords.filter(x => !outputdata.some(y => _.isEqual(y,x))) console.log(r) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script> 

比較some方法中的對象我正在使用lodash isEqual但你可以使用其他東西來測試對象。

這是使用Array.filterArray.indexOf函數的簡單解決方案:

var filtered = [], trained = {};

outputdata.forEach(function(o) {
    trained[o.User] = trained[o.User] || [];
    trained[o.User].push(o.SOP);
});
filtered = arrSOPrecords.filter(function(o) {
    return !trained[o.User] || trained[o.User].indexOf(o.SOP) === -1;
});

console.log(JSON.stringify(filtered, 0 , 4)); 

輸出:

[
    {
        "User": "Jon",
        "SOP": "training 2"
    },
    {
        "User": "Ana",
        "SOP": "training 2"
    }
]

我想為這些問題提供通用的,可重用的解決方案。 以下代碼將列出調用的數組中存在的對象,這些對象在作為參數提供的數組中缺失。 我們正在使用兩種通用方法; Object.prototype.compare()Array.prototype.diference()

 Object.prototype.compare = function(o){ var ok = Object.keys(this); return typeof o === "object" && ok.length === Object.keys(o).length ? ok.every(k => this[k] === o[k]) : false; }; Array.prototype.difference = function(a) { return this.filter(e => !a.some(f => f.compare(e))); }; var arrSOP = [ { User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Jon", SOP: "training 1" }, { User: "Jon", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Ana", SOP: "training 2" } ], outData = [ { User: "Cesar", SOP: "training 1" }, { User: "Cesar", SOP: "training 2" }, { User: "Ana", SOP: "training 1" }, { User: "Jon", SOP: "training 1" } ], filtered = arrSOP.difference(outData); console.log(JSON.stringify(filtered)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM