Javscript группируется по минимальным полям

#javascript

#javascript

Вопрос:

         data = [
        {
            "index": 0,
            "id": 47,
            "sepallengthcm": 5.1,
            "sepalwidthcm": 3.8,
            "unnamed:_3": 1.6,
            "petalwidthcm": 0.2,
            "species": "setosa"
        },
        {
            "index": 1,
            "id": 48,
            "sepallengthcm": 4.6,
            "sepalwidthcm": 3.2,
            "unnamed:_3": 1.4,
            "petalwidthcm": 0.2,
            "species": "setosa"
        },
        {
            "index": 2,
            "id": 49,
            "sepallengthcm": 5.3,
            "sepalwidthcm": 3.7,
            "unnamed:_3": 1.5,
            "petalwidthcm": 0.2,
            "species": "jennifer"
        },
        {
            "index": 3,
            "id": 50,
            "sepallengthcm": 5.0,
            "sepalwidthcm": 3.3,
            "unnamed:_3": 1.4,
            "petalwidthcm": 0.2,
            "species": "setosa"
        },
        {
            "index": 4,
            "id": 97,
            "sepallengthcm": 12.0,
            "sepalwidthcm": 2.9,
            "unnamed:_3": 4.2,
            "petalwidthcm": 1.3,
            "species": "jennifer"
        },
        {
            "index": 5,
            "id": 98,
            "sepallengthcm": 6.2,
            "sepalwidthcm": 2.9,
            "unnamed:_3": 4.3,
            "petalwidthcm": 1.3,
            "species": "jennifer"
        },
        {
            "index": 6,
            "id": 99,
            "sepallengthcm": 5.1,
            "sepalwidthcm": 2.5,
            "unnamed:_3": 3.0,
            "petalwidthcm": 1.1,
            "species": "kajol"
        },
        {
            "index": 7,
            "id": 100,
            "sepallengthcm": 11.0,
            "sepalwidthcm": 2.8,
            "unnamed:_3": 7.0,
            "petalwidthcm": 1.3,
            "species": "floaw"
        },
        {
            "index": 8,
            "id": 101,
            "sepallengthcm": 6.3,
            "sepalwidthcm": 3.3,
            "unnamed:_3": 6.0,
            "petalwidthcm": 2.5,
            "species": "Iris-flower"
        },
        {
            "index": 9,
            "id": 102,
            "sepallengthcm": 5.8,
            "sepalwidthcm": 2.7,
            "unnamed:_3": 5.1,
            "petalwidthcm": 1.9,
            "species": "Iris-flower"
        }
        ]
 

Вот мои входные данные.
Я пытаюсь получить количество этих данных, используя специальное поле

результат = distictCount(«виды»)

     result = [
            {
            "species": "Iris-flower",
            "sepallengthcm": 5.8,
            "sepalwidthcm": 2.7
            },
            {
            "species": "floaw",
            "sepallengthcm": 11.0,
            "sepalwidthcm": 2.8
            },
            {
            "species": "jennifer",
            "sepallengthcm": 5.3,
            "sepalwidthcm": 2.9
            },
            {
            "species": "kajol",
            "sepallengthcm": 5.1,
            "sepalwidthcm": 4.5
            },
            {
            "species": "setosa",
            "sepallengthcm": 3.2,
            "sepalwidthcm": 2.7
            }
        ]
 

Выше результат, который я ожидаю

Я пытаюсь достичь минимального значения путем агрегирования выбранных полей. для двух полей за раз

     let GroupMin = (arr, category, value1, value2) => {
        let result = Object.values(arr.reduce(function(r, e) {
            let key = e[category];
            if (!r[key]) r[key] = e;
            else {
                let first_value = parseFloat(r[key][value1])
                let second_value = parseFloat(r[key][value2])
                if(parseFloat(e[value1]) > first_value){
                first_value = parseFloat(e[value1]);
                }
                if(parseFloat(e[value2]) > second_value){
                second_value = parseFloat(e[value2]);
                }
            }
            return r;
        }, {}))

        return result
    }

    GroupMin(data, "setosa", "sepallengthcm", "sepalwidthcm)
 

Мой код не работает.
Пожалуйста, взгляните.

Как мы можем это сделать

Спасибо

Комментарии:

1. Разве вы не используете обратное? Для меня кажется, что вы должны использовать if(parseFloat(e[value1]) < first_value) вместо

2. Это не работает. Я протестировал, запустив

3. Кроме того, вы не присваиваете никакого значения r до его возврата в редуктор. Вы ничего не делаете с first_value и second_value

Ответ №1:

Вы могли бы сначала сгруппировать по ключу.

После того, как у вас будут свои группы, вы можете уменьшить значения и сопоставить поля с минимальными значениями.

 const key = 'species';
const fields = [ 'species', 'sepallengthcm', 'sepalwidthcm' ];

const main = () => {
  fetchData().then(data =>
    console.log(distictCount(data, key, fields)));
};

const distictCount = (data, key, fields) => {
  const groups = data.reduce((result, data) => ({
    ...result,
    [data[key]]: [ ...(result[data[key]] || []), data ]
  }), {});
  const values = Object.values(groups).map(group =>
    fields.reduce((res, field) => ({
      ...res,
      [field]: field === key
        ? group[0][key]
        : Math.min(...group.map(obj => obj[field]))
    }), {}));
  return values.sort((a, b) =>
    a[key].localeCompare(b[key], 'en', { sensitivity: 'base' }));
};

const fetchData = () => Promise.resolve([{
  "index": 0,
  "id": 47,
  "sepallengthcm": 5.1,
  "sepalwidthcm": 3.8,
  "unnamed:_3": 1.6,
  "petalwidthcm": 0.2,
  "species": "setosa"
}, {
  "index": 1,
  "id": 48,
  "sepallengthcm": 4.6,
  "sepalwidthcm": 3.2,
  "unnamed:_3": 1.4,
  "petalwidthcm": 0.2,
  "species": "setosa"
}, {
  "index": 2,
  "id": 49,
  "sepallengthcm": 5.3,
  "sepalwidthcm": 3.7,
  "unnamed:_3": 1.5,
  "petalwidthcm": 0.2,
  "species": "jennifer"
}, {
  "index": 3,
  "id": 50,
  "sepallengthcm": 5.0,
  "sepalwidthcm": 3.3,
  "unnamed:_3": 1.4,
  "petalwidthcm": 0.2,
  "species": "setosa"
}, {
  "index": 4,
  "id": 97,
  "sepallengthcm": 12.0,
  "sepalwidthcm": 2.9,
  "unnamed:_3": 4.2,
  "petalwidthcm": 1.3,
  "species": "jennifer"
}, {
  "index": 5,
  "id": 98,
  "sepallengthcm": 6.2,
  "sepalwidthcm": 2.9,
  "unnamed:_3": 4.3,
  "petalwidthcm": 1.3,
  "species": "jennifer"
}, {
  "index": 6,
  "id": 99,
  "sepallengthcm": 5.1,
  "sepalwidthcm": 2.5,
  "unnamed:_3": 3.0,
  "petalwidthcm": 1.1,
  "species": "kajol"
}, {
  "index": 7,
  "id": 100,
  "sepallengthcm": 11.0,
  "sepalwidthcm": 2.8,
  "unnamed:_3": 7.0,
  "petalwidthcm": 1.3,
  "species": "floaw"
}, {
  "index": 8,
  "id": 101,
  "sepallengthcm": 6.3,
  "sepalwidthcm": 3.3,
  "unnamed:_3": 6.0,
  "petalwidthcm": 2.5,
  "species": "Iris-flower"
}, {
  "index": 9,
  "id": 102,
  "sepallengthcm": 5.8,
  "sepalwidthcm": 2.7,
  "unnamed:_3": 5.1,
  "petalwidthcm": 1.9,
  "species": "Iris-flower"
}]);

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