Javascript:根据多个键确定并返回对象数组中的重复对象

标签 javascript arrays javascript-objects

我有一个对象数组:

    var data  = [{"monitor":"TFT",
                  "manufacturer":"MONCORP",
                  "monID":"1234",
                  "Delivery Way":"DELIVERY",
                  "BarCode Text":"Test",
                  "BarCode Id":"D9",
                  "Status":"OK"},               

                 {"monitor":"LCD",
                  "manufacturer":"MONCORP",
                  "monID":"",
                  "Delivery Way":"PICKUP",
                  "BarCode Text":"Dummy Text",
                  "BarCode Id":"P2",
                  "Status":"OK"},

                 {"monitor":"TFT",
                  "manufacturer":"MONCORP",
                  "monID":"1234",
                  "Delivery Way":"DELIVERY",
                  "BarCode Text":"ONLY TEST",
                  "BarCode Id":"D9",
                  "Status":"OK"}, 

                 {"monitor":"LCD",
                  "manufacturer":"MONCORP",
                  "monID":"1234",
                  "Delivery Way":"DELIVERY",
                  "BarCode Text":"FOR TESTING PURPOSE",
                  "BarCode Id":"D9",
                  "Status":"OK"},

                  {"monitor":"TFT",
                   "manufacturer":"MONCORP",
                   "monID":"",
                   "Delivery Way":"PICKUP",
                   "BarCode Text":"DUMMIEST TEXT",
                   "BarCode Id":"P7",
                   "Status":"OK"}];

所以我只想获取重复的对象,但我想根据键值来区分它们:监视器、制造商、monID​​、送货方式、条形码 Id、状态。

预期结果是:

    expected = [{"monitor":"TFT",
                 "manufacturer":"MONCORP",
                 "monID":"1234",
                 "Delivery Way":"DELIVERY",
                 "BarCode Text":"Test",
                 "BarCode Id":"D9",
                 "Status":"OK"},

                {"monitor":"TFT",
                 "manufacturer":"MONCORP",
                 "monID":"1234",
                 "Delivery Way":"DELIVERY",
                 "BarCode Text":"ONLY TEST",
                 "BarCode Id":"D9",
                 "Status":"OK"}]

最佳答案

在数据库级别执行此操作可能是个好主意(例如某种 GROUP BY 操作)。

在 JavaScript 中,您可以迭代数组并为每个记录创建一个哈希值,该哈希值应由您希望唯一的字段组成。然后,该哈希值可以用作映射键,即将这些记录插入具有该键的映射中将消除重复项。

示例:

var map = {};
for (var i = 0; i < data.length; i++) {
    var key = data[i].monitor + "#" + data[i].monID + "#" + data[i].manufacturer + ... ;
    map[key] = data[i];
}

map 对象最后将仅包含映射到具有该键的最后项的唯一键。

请注意,key 只是一个由您希望唯一的字段连接而成的字符串。如果您的字段包含字符 #,或者它们不是字符串类型,则它无法正常工作。如果你想走这条路,我建议计算 hash code from the string

识别重复项,您可以在迭代的每个步骤中检查是否已在 map 中:

if (map[key]) {
   // This record is a duplicate
}

为了将重复记录分组在一起,您可以构造一个映射映射键 -> 重复项数组。可以这样完成(仅显示循环内部)

var key = ...
if (!map[key]) {
    // First time we see this key, let's add it to the map
    map[key] = [ data[i] ]; // Map the key to a new array containing the current record
} else {
    // Duplicate; just add this record to the existing 
    // list of records with the same key
    map[key].push(data[i]);
}

关于Javascript:根据多个键确定并返回对象数组中的重复对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44820519/

相关文章:

javascript - 选择/取消选择和 mouseOver/mouseOut 后更改对象的颜色

javascript - backgroundPositionX 不适用于 Firefox

javascript - Aurelia:如何在绑定(bind)之前恢复到原始模型

java - 为什么数组元素必须是同一类型

javascript - 如何解构嵌套对象

JavaScript:input.focus() 并显示 Cursor

javascript - 在 Javascript 中创建一个新对象

javascript - 将字符串匹配到数组

javascript - 如何检索包含句点的 JavaScript 属性

javascript - 对于使用 Object.create() 创建的数组,Array.isArray() 返回 false