Найти минимальные / максимальные значения из списка, сгруппированного по идентификатору объекта - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь найти наибольшее и наименьшее значение в группе элементов с одинаковыми атрибутами.Например, на скриншоте максимальное значение для кадрирования: 18157 будет равно 1,77, а наименьшее - 1,68

JsFiddle: https://jsfiddle.net/kf3qhsge/

var myCrops = new Object();

for(i=0;i<crops.length;i++){
    if(crops[i]==crops[i+1]){
        var c = crops[i];
        var n = values[i];
        myCrops[i] = {"crop":c,"value":n};
    }

} 

enter image description here

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Вы можете использовать уменьшить

Здесь идея

  • Прокручивать урожай и использовать его в качестве ключа для op объекта.
  • Для каждого значения crops мы проверяем, находится ли ключ уже в op объекте или нет, если он уже существует, мы меняем максимальное и минимальное значение в зависимости от условий.
  • Если это не так, мы добавляем новый ключ с правильными значениями.

var crops  = [18002, 18154, 18154, 18155, 18155, 18155, 18156, 18156, 18156, 18156, 18157, 18157, 18157, 18157, 18157, 18158, 18158, 18158, 18158, 18158, 18158, 18159, 18159, 18159, 18159, 18159, 18159, 18159, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18176, 18176, 18176, 18176, 18176];
var values = [1.69, 1.65, 1.75, 1.7, 1.7, 1.78, 1.69, 1.62, 1.75, 1.74, 1.7, 1.72, 1.68, 1.77, 1.7, 1.62, 1.74, 1.69, 1.82, 1.68, 1.64, 1.66, 1.74, 1.57, 1.7, 1.7, 1.6, 1.66, 1.72, 1.47, 1.52, 1.7, 1.63, 1.67, 1.69, 1.7, 1.51, 1.49, 1.58, 1.63, 1.66, 1.68, 1.39, 1.71, 1.61, 1.62, 1.41, 1.52, 1.46, 1.41, 1.61, 1.65, 1.36, 1.59, 1.65, 1.64, 1.72, 1.52, 1.35, 1.49, 1.65, 1.32, 1.37, 1.69, 1.62, 1.63, 1.7, 1.72, 1.7, 1.3, 1.47, 1.56, 1.5, 1.67, 1.41, 1.73, 1.71, 1.67, 1.58, 1.73, 1.56, 1.66, 1.73, 1.57, 1.69, 1.58, 1.73, 1.47, 1.7, 1.8, 1.61, 1.77, 1.79, 1.63, 1.56, 1.58, 1.59, 1.84, 1.64, 1.77, 1.63, 1.7, 1.76, 1.73, 1.83, 1.63, 1.44, 1.32, 1.74, 1.46, 1.57, 1.67, 1.4, 1.64, 1.69, 1.58, 1.76, 1.69, 1.58, 1.72, 1.43, 1.7, 1.34, 1.69, 1.64, 1.6, 1.68, 1.5, 1.69, 1.5, 1.76, 1.47, 1.7, 1.63, 1.49, 1.48, 1.15, 1.59, 1.65, 1.6, 1.46, 1.43, 1.52, 1.55, 1.63, 1.41, 1.66, 1.62, 1.66, 1.66, 1.68, 1.63, 1.66, 1.59, 1.34, 1.67, 1.68, 1.46, 1.66, 1.77, 1.71, 1.71, 1.6, 1.47, 1.71, 1.75, 1.6, 1.58, 1.35, 1.72, 1.77, 1.68, 1.64, 1.71, 1.59, 1.63, 1.74, 1.39, 1.59, 1.71, 1.72, 1.25, 1.65, 1.7, 1.67, 1.71, 1.67, 1.49, 1.69, 1.36, 1.53, 1.73, 1.57, 1.58, 1.7, 1.61, 1.61, 1.7, 1.62, 1.69];

let op = crops.reduce((op,inp,index)=>{
  let min = op[inp] && op[inp].min
  let max = op[inp] && op[inp].max
  let value = values[index]
  if(op[inp]){
    op[inp].min = value < min ? value : min
    op[inp].max = value > max ? value : max
  } else {
    op[inp] = {crop:inp,min:value,max:value}
  }
  return op
},{})

console.log(op)
1 голос
/ 11 марта 2019

Мы можем разделить задачу в два этапа:
1. получить значения, соответствующие определенной культуре
2. получить минимум и максимум среди этих значений.

Для первого шага,Вы можете отфильтровать массив values, посмотрев соответствующий индекс в массиве crops.Для этого мы получаем, что функция, переданная в filter, допускает индекс в качестве второго параметра.Во втором случае альтернативой reduce является использование встроенных функций Math.min / Math.max.

А именно:

var crops = [18002, 18154, 18154, 18155, 18155, 18155, 18156, 18156, 18156, 18156, 18157, 18157, 18157, 18157, 18157, 18158, 18158, 18158, 18158, 18158, 18158, 18159, 18159, 18159, 18159, 18159, 18159, 18159, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18176, 18176, 18176, 18176, 18176];
var values = [1.69, 1.65, 1.75, 1.7, 1.7, 1.78, 1.69, 1.62, 1.75, 1.74, 1.7, 1.72, 1.68, 1.77, 1.7, 1.62, 1.74, 1.69, 1.82, 1.68, 1.64, 1.66, 1.74, 1.57, 1.7, 1.7, 1.6, 1.66, 1.72, 1.47, 1.52, 1.7, 1.63, 1.67, 1.69, 1.7, 1.51, 1.49, 1.58, 1.63, 1.66, 1.68, 1.39, 1.71, 1.61, 1.62, 1.41, 1.52, 1.46, 1.41, 1.61, 1.65, 1.36, 1.59, 1.65, 1.64, 1.72, 1.52, 1.35, 1.49, 1.65, 1.32, 1.37, 1.69, 1.62, 1.63, 1.7, 1.72, 1.7, 1.3, 1.47, 1.56, 1.5, 1.67, 1.41, 1.73, 1.71, 1.67, 1.58, 1.73, 1.56, 1.66, 1.73, 1.57, 1.69, 1.58, 1.73, 1.47, 1.7, 1.8, 1.61, 1.77, 1.79, 1.63, 1.56, 1.58, 1.59, 1.84, 1.64, 1.77, 1.63, 1.7, 1.76, 1.73, 1.83, 1.63, 1.44, 1.32, 1.74, 1.46, 1.57, 1.67, 1.4, 1.64, 1.69, 1.58, 1.76, 1.69, 1.58, 1.72, 1.43, 1.7, 1.34, 1.69, 1.64, 1.6, 1.68, 1.5, 1.69, 1.5, 1.76, 1.47, 1.7, 1.63, 1.49, 1.48, 1.15, 1.59, 1.65, 1.6, 1.46, 1.43, 1.52, 1.55, 1.63, 1.41, 1.66, 1.62, 1.66, 1.66, 1.68, 1.63, 1.66, 1.59, 1.34, 1.67, 1.68, 1.46, 1.66, 1.77, 1.71, 1.71, 1.6, 1.47, 1.71, 1.75, 1.6, 1.58, 1.35, 1.72, 1.77, 1.68, 1.64, 1.71, 1.59, 1.63, 1.74, 1.39, 1.59, 1.71, 1.72, 1.25, 1.65, 1.7, 1.67, 1.71, 1.67, 1.49, 1.69, 1.36, 1.53, 1.73, 1.57, 1.58, 1.7, 1.61, 1.61, 1.7, 1.62, 1.69];

function extremeValues(crop) {
    const cropValues = values.filter((value, ix) => crops[ix] === crop)
    return {min: Math.min(...cropValues), max: Math.max(...cropValues)}
}

console.log(extremeValues(18157))

«трехточечная»нотация необходима для преобразования массива в список аргументов для функций variable-arguments-count Math.min и Math.max.

Альтернативой «трехточечной» является использование библиотеки lodash:

const _ = require("lodash")

var crops = [18002, 18154, 18154, 18155, 18155, 18155, 18156, 18156, 18156, 18156, 18157, 18157, 18157, 18157, 18157, 18158, 18158, 18158, 18158, 18158, 18158, 18159, 18159, 18159, 18159, 18159, 18159, 18159, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18176, 18176, 18176, 18176, 18176];
var values = [1.69, 1.65, 1.75, 1.7, 1.7, 1.78, 1.69, 1.62, 1.75, 1.74, 1.7, 1.72, 1.68, 1.77, 1.7, 1.62, 1.74, 1.69, 1.82, 1.68, 1.64, 1.66, 1.74, 1.57, 1.7, 1.7, 1.6, 1.66, 1.72, 1.47, 1.52, 1.7, 1.63, 1.67, 1.69, 1.7, 1.51, 1.49, 1.58, 1.63, 1.66, 1.68, 1.39, 1.71, 1.61, 1.62, 1.41, 1.52, 1.46, 1.41, 1.61, 1.65, 1.36, 1.59, 1.65, 1.64, 1.72, 1.52, 1.35, 1.49, 1.65, 1.32, 1.37, 1.69, 1.62, 1.63, 1.7, 1.72, 1.7, 1.3, 1.47, 1.56, 1.5, 1.67, 1.41, 1.73, 1.71, 1.67, 1.58, 1.73, 1.56, 1.66, 1.73, 1.57, 1.69, 1.58, 1.73, 1.47, 1.7, 1.8, 1.61, 1.77, 1.79, 1.63, 1.56, 1.58, 1.59, 1.84, 1.64, 1.77, 1.63, 1.7, 1.76, 1.73, 1.83, 1.63, 1.44, 1.32, 1.74, 1.46, 1.57, 1.67, 1.4, 1.64, 1.69, 1.58, 1.76, 1.69, 1.58, 1.72, 1.43, 1.7, 1.34, 1.69, 1.64, 1.6, 1.68, 1.5, 1.69, 1.5, 1.76, 1.47, 1.7, 1.63, 1.49, 1.48, 1.15, 1.59, 1.65, 1.6, 1.46, 1.43, 1.52, 1.55, 1.63, 1.41, 1.66, 1.62, 1.66, 1.66, 1.68, 1.63, 1.66, 1.59, 1.34, 1.67, 1.68, 1.46, 1.66, 1.77, 1.71, 1.71, 1.6, 1.47, 1.71, 1.75, 1.6, 1.58, 1.35, 1.72, 1.77, 1.68, 1.64, 1.71, 1.59, 1.63, 1.74, 1.39, 1.59, 1.71, 1.72, 1.25, 1.65, 1.7, 1.67, 1.71, 1.67, 1.49, 1.69, 1.36, 1.53, 1.73, 1.57, 1.58, 1.7, 1.61, 1.61, 1.7, 1.62, 1.69];

function extremeValues(crop) {
    const cropValues = values.filter((value, ix) => crops[ix] === crop)
    return {min: _.min(cropValues), max: _.max(cropValues)}
}

Конечно, вам нужно включить библиотеку lodash, чтобы последний вариант работал.

Надеюсь, это поможет - Карлос

0 голосов
/ 11 марта 2019

Это проще по времени и пространственной сложности, чем другие решения * здесь:

var crops  = [18002, 18154, 18154, 18155, 18155, 18155, 18156, 18156, 18156, 18156, 18157, 18157, 18157, 18157, 18157, 18158, 18158, 18158, 18158, 18158, 18158, 18159, 18159, 18159, 18159, 18159, 18159, 18159, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18160, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18161, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18162, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18163, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18164, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18165, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18166, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18167, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18168, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18171, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18172, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18173, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18174, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18175, 18176, 18176, 18176, 18176, 18176];
var values = [1.69, 1.65, 1.75, 1.7, 1.7, 1.78, 1.69, 1.62, 1.75, 1.74, 1.7, 1.72, 1.68, 1.77, 1.7, 1.62, 1.74, 1.69, 1.82, 1.68, 1.64, 1.66, 1.74, 1.57, 1.7, 1.7, 1.6, 1.66, 1.72, 1.47, 1.52, 1.7, 1.63, 1.67, 1.69, 1.7, 1.51, 1.49, 1.58, 1.63, 1.66, 1.68, 1.39, 1.71, 1.61, 1.62, 1.41, 1.52, 1.46, 1.41, 1.61, 1.65, 1.36, 1.59, 1.65, 1.64, 1.72, 1.52, 1.35, 1.49, 1.65, 1.32, 1.37, 1.69, 1.62, 1.63, 1.7, 1.72, 1.7, 1.3, 1.47, 1.56, 1.5, 1.67, 1.41, 1.73, 1.71, 1.67, 1.58, 1.73, 1.56, 1.66, 1.73, 1.57, 1.69, 1.58, 1.73, 1.47, 1.7, 1.8, 1.61, 1.77, 1.79, 1.63, 1.56, 1.58, 1.59, 1.84, 1.64, 1.77, 1.63, 1.7, 1.76, 1.73, 1.83, 1.63, 1.44, 1.32, 1.74, 1.46, 1.57, 1.67, 1.4, 1.64, 1.69, 1.58, 1.76, 1.69, 1.58, 1.72, 1.43, 1.7, 1.34, 1.69, 1.64, 1.6, 1.68, 1.5, 1.69, 1.5, 1.76, 1.47, 1.7, 1.63, 1.49, 1.48, 1.15, 1.59, 1.65, 1.6, 1.46, 1.43, 1.52, 1.55, 1.63, 1.41, 1.66, 1.62, 1.66, 1.66, 1.68, 1.63, 1.66, 1.59, 1.34, 1.67, 1.68, 1.46, 1.66, 1.77, 1.71, 1.71, 1.6, 1.47, 1.71, 1.75, 1.6, 1.58, 1.35, 1.72, 1.77, 1.68, 1.64, 1.71, 1.59, 1.63, 1.74, 1.39, 1.59, 1.71, 1.72, 1.25, 1.65, 1.7, 1.67, 1.71, 1.67, 1.49, 1.69, 1.36, 1.53, 1.73, 1.57, 1.58, 1.7, 1.61, 1.61, 1.7, 1.62, 1.69];

var myCrops = {};
for (i = 0; i < crops.length; i++) {
    
    var c = crops[i];
    if (c in myCrops) {

        var v = myCrops[c];

        if (values[i] > v.max)
            myCrops[c].max = values[i];
        if (values[i] < v.min)
            myCrops[c].min = values[i];
    }
    else {
        myCrops[c] = { min: values[i], max: values[i] };
    } 
}


console.log("Min/Max for crop 18157:\n", myCrops[18157]);

console.log("Min/Max for all crops:\n", myCrops);

Выходы для myCrops[18157]:

{мин: 1,68, макс: 1,77}

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