Фильтр списка - удалить меньший из двух повторяющихся элементов на основе ключа счета - PullRequest
0 голосов
/ 24 мая 2018

В этой задаче у меня есть список покупок, который я хочу отфильтровать, удалив дубликаты и сохранив только дубликаты с большим количеством.Затем также сохраняя элементы, которые не являются дубликатами.Я закончил эту работу по простому программированию по стечению обстоятельств и хотел бы изучить лучший способ решения этой проблемы.Я прокомментировал мой код ниже, чтобы поделиться тем, что происходит, и моим мыслительным процессом.Если у кого-то есть лучший способ решить эту проблему, я бы с удовольствием его изучил.

var groceryList = [
  {
    item: "Bananas",
    count: 4
  },
  {
    item: "Bananas",
    count: 3
  },
  {
    item: "Brussel Sprouts",
    count: 2
  },
  {
    item: "Bacon",
    count: 100
  },
  {
    item: "Beans",
    count: 19
  },
  {
    item: "Beans",
    count: 5
  }
]

const seen = {}
const newList = []
var removeDups = []
const list = groceryList.map(function(item) {
  // if we haven't this item before (via check on item name) push it into seen object
  // also push it to newList array
  if (!seen[item.item]) {
    seen[item.item] = item
    newList.push(item)
  }
  // if we have seen the item during iteration...
  else if (seen[item.item]) {
    // remove it from the newList array
    removeDups = newList.filter(function(listItem) {
      if (listItem.item == item.item) {
        console.log('matched');
      } else {
        return true
      }
    })

    // and push in the item with the higher count
    if (seen[item.item].count > item.count) {
      removeDups.push(seen[item.item])
    } else {
      removeDups.push(item)
    }
  }
})

console.log(removeDups);

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

Вот еще один ответ, возможно, немного проще.В основном используется тот факт, что объект имеет уникальные ключи и Math.max для выбора большего числа элементов.

newList = [];
for(var i in groceryList){
  let count = newList[groceryList[i].item] || 0;
    newList[groceryList[i].item] = Math.max(groceryList[i].count, count);
};

console.log(newList);

Fiddle: https://jsfiddle.net/w2szmmya/

0 голосов
/ 25 мая 2018

Вы можете взять хеш-таблицу и использовать оригинальные объекты, не создавая новые.

var groceryList = [ { item: "Bananas", count: 3 }, { item: "Bananas", count: 4 }, { item: "Brussel Sprouts", count: 2 }, { item: "Bacon", count: 100 }, { item: "Beans", count: 19 }, { item: "Beans", count: 5 }],
    hash = Object.create(null),
    uniques = groceryList.reduce((r, o) => {
        if (!(o.item in hash)) {
            hash[o.item] = r.push(o) - 1;
        }
        if (r[hash[o.item]].count < o.count) {
            r[hash[o.item]] = o;
        }
        return r;
    }, []);
    
console.log(uniques);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 25 мая 2018

Вы можете создать карту / объект с именем в качестве ключа, чтобы у вас были уникальные элементы и значения переопределения, если значение выше

var groceryList = [
  {
    item: "Bananas",
    count: 4
  },
  {
    item: "Bananas",
    count: 3
  },
  {
    item: "Brussel Sprouts",
    count: 2
  },
  {
    item: "Bacon",
    count: 100
  },
  {
    item: "Beans",
    count: 19
  },
  {
    item: "Beans",
    count: 5
  }
];

let result = groceryList.reduce((map, obj) => {
   if (!(obj.item in map) || (obj.item in map && map[obj.item] < obj.count)) {
      map[obj.item] = obj.count;
   }
   return map;
}, {});
result = Object.keys(result).map(item => ({item , count: result[item]}));
console.log(result);
0 голосов
/ 25 мая 2018

Вы можете использовать reduce для краткого преобразования массива в другой (или в объект), когда входные и выходные элементы не обязательно являются однозначными:

var groceryList=[{item:"Bananas",count:4},{item:"Bananas",count:3},{item:"Brussel Sprouts",count:2},{item:"Bacon",count:100},{item:"Beans",count:19},{item:"Beans",count:5}]
const filteredListObj = groceryList.reduce((a, { item, count }) => {
  // this is a new item, or a duplicate with a greater quantity:
  if (!a[item] || a[item].count < count) a[item] = { item, count };
  return a;
}, {});
const filteredList = Object.values(filteredListObj);
console.log(filteredList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...