Уменьшить массив на основе свойств 2 клавиш - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть такой массив.

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]

Мне нужно получить такой массив:

var newData = [{
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}]

То есть получить наибольшее значение для каждого ключа name вмассив.

Вот что я пробовал:

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]

console.log(data.reduce(function(prev, current) {
  return (prev.name !== current.name && prev.value > current.value) ? prev : current
}))

Пожалуйста, совет.

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]
let result=data.reduce(function(temp, current) {
  //check if temp has object
  var found = temp.some((el) => {
      return el.name === current.name
    });
  //if not found, add the object
    if (!found) { temp.push(current) }
  //if found and value is greater, replace the max value
  else{
    temp.find((element) => {
     if(element.name === current.name && element.value<current.value)
    element.value=current.value
    })
  }
  return temp
},[])
console.log(result);
0 голосов
/ 14 ноября 2018

Используйте Reduce и проверьте, имеет ли массив аккумуляторов тот же фрукт, используя findIndex.Если это -1, то в массиве накопителей нажмите значение, иначе обновите счет в этом индексе

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]



let result = data.reduce(function(acc, curr) {

  let findIfExist = acc.findIndex(elem => {
    return elem.name === curr.name;
  })
  if (findIfExist === -1) {
    acc.push(curr)
  } else {
    if (acc[findIfExist].value < curr.value) {
      acc[findIfExist].value = curr.value
    }

  }

  return acc;

}, [])

console.log(result)
0 голосов
/ 14 ноября 2018

Используйте forEach вместо reduce

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}]

let result = {};
data.forEach(function(current) {
  if (result[current.name] &&
    result[current.name].value < current.value &&
    result[current.name].category === current.category) {
    result[current.name].value = current.value;
  } else if (!result[current.name]) {
    result[current.name] = current;
  }
});
console.log(Object.values(result));
0 голосов
/ 14 ноября 2018

Вам необходимо отслеживать текущие максимальные value элементы для каждые name, чтобы вы могли попробовать преобразовать в объект, ключи которого - name s, а значения - в настоящее время выигрывает value с этим именем. Затем получите значения результирующего объекта:

var data = [{
  name: 'Apple',
  category: 'Fruit',
  value: 12
}, {
  name: 'Apple',
  category: 'Fruit',
  value: 20
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 65
}, {
  name: 'Orange',
  category: 'Fruit',
  value: 40
}];

console.log(Object.values(
  data.reduce((a, item) => {
    const { name, value } = item;
    if (!a[name] || a[name].value < value) a[name] = item;
    return a;
  }, {})
));

(Ваш метод prev.name !== current.name ... сработает только в том случае, если вы в конце пытаетесь извлечь из него один элемент - потому что вам нужно больше, вам нужен объект, который может содержать несколько элементов. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...