代码之家  ›  专栏  ›  技术社区  ›  Stephan-v

如何基于2个属性删除阵列中的重复对象?

  •  2
  • Stephan-v  · 技术社区  · 7 年前

    room_rate_type_id 属性:

    const rooms = [{
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    const newRooms = rooms.filter((room, index, array) => {
      const roomRateTypeIds = rooms.map(room => room.room_rate_type_id);
      // Returns the first index found.
      return roomRateTypeIds.indexOf(room.room_rate_type_id) === index;
    });
    
    console.log(newRooms);

    但是,我还需要确保只有当对象的 房间价格类型id

    6 回复  |  直到 7 年前
        1
  •  9
  •   marvel308    7 年前

    你能做到的

    const rooms = [
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    let result = rooms.filter((e, i) => {
        return rooms.findIndex((x) => {
        return x.room_rate_type_id == e.room_rate_type_id && x.price == e.price;}) == i;
    
    });
    
    console.log(result);

    这将过滤除任何对象第一次出现之外的所有重复项

        2
  •  3
  •   Ori Drori    7 年前

    reduce 数组到 Map Map#values 返回阵列:

    const rooms = [{
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    const newRooms = [...rooms.reduce((m, r) => {
      const key = `${r.room_rate_type_id}-${r.price}`; // create the key by combining both props
      return m.has(key) ? m : m.set(key, r); // if key exists skip, if not add to map
    }, new Map()).values()]; // get the map values and convert back to array
    
    console.log(newRooms);
        3
  •  2
  •   T.J. Crowder    7 年前

    const newRooms = rooms.filter((room, index) => {
      // Only include this room if there isn't another room earlier
      // in the array that has the same values
      return !rooms.some((r, i) =>
        i < index &&
        r.room_rate_type_id == room.room_rate_type_id &&
        r.price == room.price
      );
    });
    

    const rooms = [{
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    const newRooms = rooms.filter((room, index) => {
      // Only include this room if there isn't another room earlier
      // in the array that has the same values
      return !rooms.some((r, i) =>
        i < index &&
        r.room_rate_type_id == room.room_rate_type_id &&
        r.price == room.price
      );
    });
    
    console.log(newRooms);
    .as-console-wrapper {
      max-height: 100% !important;
    }

    如果数组真的很大,那么效率会很低,最好记住以前看到的组合,而不是不断地重新搜索数组:

    const seenRooms = Object.create(null);
    const newRooms = rooms.filter((room, index) => {
      const key = room.room_rate_type_id + "**" + room.price;
      if (seenRooms[key]) {
        return false;
      }
      seenRooms[key] = true;
      return true;
    });
    

    const rooms = [{
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    const seenRooms = Object.create(null);
    const newRooms = rooms.filter((room, index) => {
      const key = room.room_rate_type_id + "**" + room.price;
      if (seenRooms[key]) {
        return false;
      }
      seenRooms[key] = true;
      return true;
    });
    
    console.log(newRooms);
    .作为控制台包装{
    最大高度:100%!重要的
    }

        4
  •  1
  •   RomanPerekhrest    7 年前

    简单方法:使用 room_rate_type_id price

    const rooms = [
        {room_rate_type_id: 202,price: 200},{room_rate_type_id: 202,price: 200},{room_rate_type_id: 202,price: 189},{room_rate_type_id: 190,price: 200}
    ];
    
    const roomRateKeys = [];
    const newRooms = rooms.filter((r, i, a) => {
        var k = r.room_rate_type_id + "" + r.price;
        if (roomRateKeys.indexOf(k) === -1) {
            roomRateKeys.push(k);
    	return r;
        }
    });
    
    console.log(newRooms);
        5
  •  0
  •   Olian04    7 年前

    这可以做到:

    const rooms = [{
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    const newRooms = rooms.reduce((rooms, room) => {
      let l = rooms.filter(r => {
        return r.room_rate_type_id === room.room_rate_type_id && r.price === room.price;
      });
      if (l.length === 0) {
        return [...rooms, room]
      }
      return rooms;
    }, [rooms[0]]);
    
    console.log(newRooms);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        6
  •  0
  •   Marko Savic    7 年前

    const rooms = [
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 200
      },
      {
        room_rate_type_id: 202,
        price: 189
      },
      {
        room_rate_type_id: 190,
        price: 200
      }
    ];
    
    let newRooms = rooms.filter((x, i, arr) => arr.findIndex(y => y.room_rate_type_id === x.room_rate_type_id && y.price === x.price) === i);
    
    
    console.log(newRooms);