代码之家  ›  专栏  ›  技术社区  ›  kaka1234

比较json对象数组中的值

  •  1
  • kaka1234  · 技术社区  · 7 年前

    我有一个json数组1作为:

    [
     { id:0, name:"adam", uName: "aSilver", uId: "123", table: "table1"},
     { id:1, name:"john", uName: "jBerlin", uId: "456", table: "table1"}
    ]
    

    我还有另一个json数组2:

    [
     { id:0, name:"adam", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
    "auto", createdOn: "09/10/2018", desc: "none", table: "table1"},
     { id:1, name:"john", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
    "auto", createdOn: "09/10/2018", desc: "none1", table: "table1"},
     { id:0, name:"steve" uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
     789", createdBy: "auto", createdOn: "09/10/2018", desc: "none2", table: 
    "table2"},
     { id:0, name:"nash", uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
     789", createdBy: "auto", createdOn: "09/10/2018", desc: "none3", table: 
    "table2"},
     { id:0, name:"sand", uName: "aSilver", uId: "123", createdBy: "auto", 
    createdOn: "09/10/2018", desc: "none4", table: "table3"}
    ]
    

    我必须检查array1中uname+uid的组合是否存在于array2中

    从array2开始,首先我只能得到唯一的值。唯一值基于“表”键。结果如下:

    [
     { id:0, name:"adam", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
    "auto", createdOn: "09/10/2018", desc: "none", table: "table1"},
     { id:0, name:"steve" uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
    789", createdBy: "auto", createdOn: "09/10/2018", desc: "none2", table: 
    "table2"},
     { id:0, name:"sand", uName: "aSilver", uId: "123", createdBy: "auto", 
    createdOn: "09/10/2018", desc: "none4", table: "table3"}
    ]
    

    现在我可以循环上面的数组,创建新的json数组3,如下所示:

    [
     { comparer: "aSilver_123, jBerlin_456", table: "table1" }
     { comparer: "aSilver_456, jBerlin_456, pParis_789", table: "table 2" }
     { comparer: "aSilver_123", table: "table 3" }
    ]
    

    现在我需要比较数组1&仅限array3比较器键

    现在,我发现下面的方法可以检查唯一性,但我必须在对象数组中找到唯一性,这样就行不通了。

         Array.prototype.unique = function () {
            var r = new Array();
            o: for (var i = 0, n = this.length; i < n; i++) {
                for (var x = 0, y = r.length; x < y; x++) {
                    if (r[x] == this[i]) {                       
                        return false;
                    }
                }
                r[r.length] = this[i];
            }
            return true;
        }
    

    想知道什么是最有效的方法吗?

    谢谢

    jsfiddle :

    http://jsfiddle.net/50pxjkda/7

    1 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

    创建一个对象,其键是 table 的属性 array2 . 由于对象键是唯一的,这将获得唯一的对象。

    obj = {};
    array2.forEach(o => obj[o.table] = o);
    unique_array2 = Object.keys(obj).map(k => obj[k]);
    

    找到共同的元素 array1 unique_array2 您只需使用嵌套循环来比较属性。

    matches = [];
    array1.forEach(o1 => unique_array2.forEach(o2 => {
        if (o1.uName == o2.uName && o1.uid == o2.uid) {
            matches.push(o1);
        }
    }));