通过2个匹配属性从对象数组中删除重复项

时间:2020-01-23 14:59:36

标签: javascript arrays sorting

当键值“ hour_from”和“ hour_to”相同时,我试图从字典中删除重复的元素。我正在使用double(我不记得要使用其他成本更低的算法了),但是索引值存在问题。

var hours_array = [
{day: "Mon", hour_from: "00:00", hour_to: "00:00"},
{day: "Mon", hour_from: "00:00", hour_to: "00:16"},
{day: "Mon", hour_from: "00:00", hour_to: "00:16"},
{day: "Thu", hour_from: "00:00", hour_to: "00:25"},
{day: "Mon", hour_from: "00:00", hour_to: "00:33"},
{day: "Fri", hour_from: "00:00", hour_to: "00:83"},
{day: "Sat", hour_from: "02:00", hour_to: "05:33"},
{day: "Thu", hour_from: "02:00", hour_to: "05:33"},
{day: "Wed", hour_from: "12:00", hour_to: "14:00"},
{day: "Sun", hour_from: "22:25", hour_to: "13:45"}]

for (let i=0; i< hours_array.length; i++){
 for (let j=0; j<=hours_array.length; j++){
  if ((hours_array[i]['hour_from'] == hours_array[j]['hour_from']) && (hours_array[i]['hour_to'] == hours_array[j]['hour_to'])){
  delete hours_array[j];
  }
 }
}

我认为索引值有误:

enter image description here

编辑:所需结果:

var hours_array = [
{day: "Mon", hour_from: "00:00", hour_to: "00:00"},
{day: "Mon", hour_from: "00:00", hour_to: "00:16"},
{day: "Thu", hour_from: "00:00", hour_to: "00:25"},
{day: "Mon", hour_from: "00:00", hour_to: "00:33"},
{day: "Fri", hour_from: "00:00", hour_to: "00:83"},
{day: "Sat", hour_from: "02:00", hour_to: "05:33"},
{day: "Wed", hour_from: "12:00", hour_to: "14:00"},
{day: "Sun", hour_from: "22:25", hour_to: "13:45"}]

有什么建议吗? 还有一些更有效的算法吗? 感谢您的阅读!

4 个答案:

答案 0 :(得分:3)

您可以在Set的帮助下过滤数组。

如果集合中包含哈希值(从hour_fromhour_to构建),则该项目将被滤除。如果不是,则将哈希值放入集合并使用该项目。

var getKey = ({ hour_from, hour_to }) => [hour_from, hour_to].join('|'),
    hours_array = [{ day: "Mon", hour_from: "00:00", hour_to: "00:00" }, { day: "Mon", hour_from: "00:00", hour_to: "00:16" }, { day: "Mon", hour_from: "00:00", hour_to: "00:16" }, { day: "Thu", hour_from: "00:00", hour_to: "00:25" }, { day: "Mon", hour_from: "00:00", hour_to: "00:33" }, { day: "Fri", hour_from: "00:00", hour_to: "00:83" }, { day: "Sat", hour_from: "02:00", hour_to: "05:33" }, { day: "Thu", hour_from: "02:00", hour_to: "05:33" }, { day: "Wed", hour_from: "12:00", hour_to: "14:00" }, { day: "Sun", hour_from: "22:25", hour_to: "13:45" }],
    unique = hours_array.filter((s => o => !s.has(getKey(o)) && s.add(getKey(o)))(new Set));

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

答案 1 :(得分:2)

您可能会对Array.prototype.reduce()Array.prototype.find()一无所知。

const src = [{day:"Mon",hour_from:"00:00",hour_to:"00:00"},{day:"Mon",hour_from:"00:00",hour_to:"00:16"},{day:"Mon",hour_from:"00:00",hour_to:"00:16"},{day:"Thu",hour_from:"00:00",hour_to:"00:25"},{day:"Mon",hour_from:"00:00",hour_to:"00:33"},{day:"Fri",hour_from:"00:00",hour_to:"00:83"},{day:"Sat",hour_from:"02:00",hour_to:"05:33"},{day:"Thu",hour_from:"02:00",hour_to:"05:33"},{day:"Wed",hour_from:"12:00",hour_to:"14:00"},{day:"Sun",hour_from:"22:25",hour_to:"13:45"}],
      dedupe = src.reduce((res, item) => 
        (
          !res.find(({hour_from, hour_to}) => 
            hour_from == item.hour_from && hour_to == item.hour_to) ? 
          res.push(item) : 
          true, res
        ), [])
      
console.log(dedupe)

答案 2 :(得分:0)

在这一行for (let j=0; j<=hours_array.length; j++){中,您可以耗尽阵列的边界。在您的情况下,array.length为10,但是当您尝试访问索引为10的元素时,您会得到未定义的信息,因为您的最后一个索引为9。长度乘以1。请参见下面的解决方案:

<=

编辑:好的,您了解此问题,下一个问题是,如果数组仍在循环,则删除一个元素。有很多方法可以解决此问题,但最简单的方法是创建一个新数组并将唯一元素推入该新数组。让我知道您是否需要帮助。

答案 3 :(得分:0)

结合使用reduceObject.values方法。

var hours_array = [
  { day: "Mon", hour_from: "00:00", hour_to: "00:00" },
  { day: "Mon", hour_from: "00:00", hour_to: "00:16" },
  { day: "Mon", hour_from: "00:00", hour_to: "00:16" },
  { day: "Thu", hour_from: "00:00", hour_to: "00:25" },
  { day: "Mon", hour_from: "00:00", hour_to: "00:33" },
  { day: "Fri", hour_from: "00:00", hour_to: "00:83" },
  { day: "Sat", hour_from: "02:00", hour_to: "05:33" },
  { day: "Thu", hour_from: "02:00", hour_to: "05:33" },
  { day: "Wed", hour_from: "12:00", hour_to: "14:00" },
  { day: "Sun", hour_from: "22:25", hour_to: "13:45" }
];

const updated = Object.values(
  hours_array.reduce(
    (acc, curr) => ({
      ...acc,
      [`${curr.hour_from}-${curr.hour_to}`]: { ...curr }
    }),
    {}
  )
);

console.log(updated);