【问题标题】:Javascript: Remove duplicate objects from array with conditionsJavascript:使用条件从数组中删除重复对象
【发布时间】:2020-11-26 04:57:41
【问题描述】:

我有一个看起来像这样的数组:

var array = [
  { name: "product1", rating: 1 },
  { name: "product3", rating: 2 },
  { name: "product1", rating: 2 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 },
  { name: "product2", rating: 2 }
]

我想消除具有重复名称的对象,但想保留评分最低的对象。最终得到:

var newarray = [
  { name: "product1", rating: 1 },
  { name: "product2", rating: 2 },
  { name: "product3", rating: 1 },
  { name: "product4", rating: 2 }
]

使用过滤器,由于评级不同,我最终在 newarray 中有两个 product1 和 product3。按名称定位,我最终会根据其原始位置在数组中找到对象,这是行不通的。

我正在寻找一种使用 vanilla javascript 的方法来比较每个重复对象的值并推送具有最低值的对象。

每个产品名称最多可出现 3 次。值只能是 1 或 2。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您可以使用reduce 按名称分组,其中每个名称评分最低的元素

    const array = [
      { name: "product1", rating: 1 },
      { name: "product3", rating: 2 },
      { name: "product1", rating: 2 },
      { name: "product2", rating: 2 },
      { name: "product3", rating: 1 },
      { name: "product4", rating: 2 },
      { name: "product2", rating: 2 },
    ]
    
    const res = Object.values(
      array.reduce((acc, el) => {
        if (!acc[el.name] || acc[el.name].rating > el.rating) {
          acc[el.name] = el
        }
        return acc
      }, {})
    )
    
    console.log(res)

    【讨论】:

      【解决方案2】:

      由于已经提到了 reduce,我想我会举一个使用 .filter() 的示例,因为您可以在不同的领域获得一些灵活性。

      var array = [
        { name: "product1", rating: 1 },
        { name: "product3", rating: 2 },
        { name: "product1", rating: 2 },
        { name: "product2", rating: 2 },
        { name: "product3", rating: 1 },
        { name: "product4", rating: 2 },
        { name: "product2", rating: 2 }
      ];
      var newArray = array.filter((value,iteration,arr)=>{
          for(var i = 0; i < arr.length; i++){
              if(value.name === arr[i].name && iteration != i){
                  if(value.rating > arr[i].rating){
                      return false
                  }else if(value.rating === arr[i].rating && iteration > i){
                      return false
                  }
              }
          }
          return true
      });
      /*newArray
      [
          { name: 'product1', rating: 1 },
          { name: 'product2', rating: 2 },
          { name: 'product3', rating: 1 },
          { name: 'product4', rating: 2 }
      ]*/
      

      Reduce 在大多数情况下应该更快,但你永远不知道。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        • 1970-01-01
        • 2018-06-19
        • 2014-06-25
        • 2020-10-25
        • 2021-01-23
        相关资源
        最近更新 更多