Tenho um objeto em javascript como este:
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
Existe uma maneira rápida de obter o valor mínimo e máximo entre as propriedades sem ter que percorrer todos eles? porque o objeto que tenho é enorme e preciso obter o valor mínimo / máximo a cada dois segundos. (Os valores do objeto continuam mudando).
javascript
jquery
Youssef
fonte
fonte
Respostas:
Não há como encontrar o máximo / mínimo no caso geral sem percorrer todos os n elementos (se você for de 1 para n-1, como saber se o elemento n não é maior (ou menor) que o máx / min atual)?
Você mencionou que os valores mudam a cada dois segundos. Se você sabe exatamente quais valores mudam, você pode começar com seus valores máx. / Mín. Anteriores e apenas comparar com os novos, mas mesmo neste caso, se um dos valores que foram modificados era o antigo máx. / Mín., Você pode precisa percorrê-los novamente.
Outra alternativa - novamente, apenas se o número de valores que mudam for pequeno - seria armazenar os valores em uma estrutura como uma árvore ou um heap e, conforme os novos valores chegam, você os insere (ou atualiza) apropriadamente. Mas se você pode fazer isso, não fica claro com base em sua pergunta.
Se você deseja obter o elemento máximo / mínimo de uma determinada lista enquanto percorre todos os elementos, então você pode usar algo como o snippet abaixo, mas não será capaz de fazer isso sem passar por todos eles
fonte
Atualização: versão moderna (ES6 +)
Resposta Original:
Experimente isto:
e depois:
Demonstração ao vivo: http://jsfiddle.net/7GCu7/1/
fonte
max = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
Math.max(...arr);
min
emax
ter que percorrer a matriz de entrada de qualquer maneira - de que outra forma eles encontrariam o maior ou o menor elemento?Portanto, apenas um
for..in
loop rápido funcionará bem.fonte
O(n log n)
, que é inerentemente mais lento doO(n)
que apenas escanear uma vez seria ...Você poderia tentar:
fonte
fonte
Você também pode tentar com
Object.values
fonte
Usando a biblioteca Lodash, você pode escrever de forma mais curta
fonte
Aqui está uma solução que permite que você retorne a chave também e faça apenas um loop. Ele classifica as entradas do objeto (por val) e retorna a primeira e a última.
Além disso, ele retorna o Objeto classificado que pode substituir o Objeto existente para que as classificações futuras sejam mais rápidas porque já estará semi-classificado = melhor que O (n). É importante observar que os Objetos mantêm sua ordem no ES6.
fonte
Para estruturas aninhadas de profundidade diferente, ou seja
{node: {leaf: 4}, leaf: 1}
, isso funcionará (usando lodash ou sublinhado):fonte
fonte
Isso funciona para mim:
fonte