javascript - 根据多个属性在数组中查找唯一对象

新手上路,请多包涵

我需要根据下面的 2 个属性从数组中找到唯一的对象。当“class”和“fare”匹配时,我需要提取唯一值并将它们放入结果数组中。

资源:

 var arr = [{class:"second", fare: "a"},
 {class:"second", fare: "b"},
 {class:"first", fare: "a"},
 {class:"first", fare: "a"},
 {class:"second", fare: "a"},
 {class:"first", fare: "c"}
]

预期结果:

 var result = [{class:"second", fare: "a"},
 {class:"second", fare: "b"},
 {class:"first", fare: "a"},
 {class:"first", fare: "c"}
]

我查看了 SO 并找到了基于一个属性过滤的答案( Create array of unique objects by property ),但找不到基于 2 个属性的答案。

原文由 whyAto8 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 509
2 个回答

您可以为哈希表构建组合键并过滤给定的数组。

 var arr = [{ class: "second", fare: "a" }, { class: "second", fare: "b" }, { class: "first", fare: "a" }, { class: "first", fare: "a" }, { class: "second", fare: "a" }, { class: "first", fare: "c" }],
    result = arr.filter(function (a) {
        var key = a.class + '|' + a.fare;
        if (!this[key]) {
            this[key] = true;
            return true;
        }
    }, Object.create(null));

console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

同样没有(误)使用 thisArgArray#filter

 var array = [{ class: "second", fare: "a" }, { class: "second", fare: "b" }, { class: "first", fare: "a" }, { class: "first", fare: "a" }, { class: "second", fare: "a" }, { class: "first", fare: "c" }],
    seen = Object.create(null),
    result = array.filter(o => {
        var key = ['class', 'fare'].map(k => o[k]).join('|');
        if (!seen[key]) {
            seen[key] = true;
            return true;
        }
    });

console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

原文由 Nina Scholz 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用组合键和地图

 const array = [
 { class: "second", fare: "a" },
 { class: "second", fare: "b" },
 { class: "first", fare: "a" },
 { class: "first", fare: "a" },
 { class: "second", fare: "a" },
 { class: "first", fare: "c" }
];

console.log(unique(array, ['class', 'fare']));

function unique(arr, keyProps) {
 const kvArray = arr.map(entry => {
  const key = keyProps.map(k => entry[k]).join('|');
  return [key, entry];
 });
 const map = new Map(kvArray);
 return Array.from(map.values());
}

原文由 Tamo Maes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题