2015-03-05 1 views
2

j'ai un objet comme celui-ci:« next » valeur numérique dans l'objet

var rock = { 
5: 0.5, 
0: 0.8, 
10: 0.3, 
2: 1.0, 
} 

J'ai un certain nombre comme 4.3 et j'ai besoin de l'indice et la valeur du numer avant et après. Dans cet exemple, je recevrais

var timeA = 2; 
var valueA = 1.0 
var timeB = 5; 
var valueB = 0.5; 

Ma première idée était quelque chose comme une boucle for, mais je ne sais pas comment faire en sorte que ce soit dans le bon ordre.

+5

Vous avez un objet, de sorte que l'ordre de vos valeurs est pas garantie. –

+0

@ Ja͢ck c'est mon problème. – wernersbacher

Répondre

2

Parce que n'est pas garanti la commande clé des objets, vous auriez à itérer sur toutes les clés et le travail le plus proche valeur inférieure et supérieure:

var rock = { 
0: 0.8, 
2: 1.0, 
5: 0.5, 
10: 0.3 
}; 

var max = Infinity, min = -Infinity; 
var to_find = 4.3; 

Object.keys(rock).forEach(function(k) { 
    var value = +k; 

    if (value <= to_find && value > min) { 
     min = value; 
    } else if (value >= to_find && value < max) { 
     max = value; 
    } 
}); 

console.log(min, rock[min], max, rock[max]); // 2, 1, 5, 0.5 

Notez que la suite min ou max peut encore avoir leurs valeurs d'origine, c'est-à-dire -Infinity et Infinity, auquel cas undefined serait produit lorsqu'il est utilisé comme clé pour rock.

-2

Vous pouvez faire quelque chose comme ceci:

for (var i in rock) { 
    if (rock.hasOwnProperty(i) && rock[i] !== null) { 
     var val = rock[i]; 
     console.log("rock["+i+"] = ", val); 
    } 
}; 

Mais les objets JS ne sont pas nativement triés. Vous voudrez peut-être regarder this question pour comprendre comment cela fonctionne et ce que vous pouvez faire à ce sujet.

+0

_rock_ est un objet, pas un tableau, donc il n'a pas de méthode _forEach_ – Grundy

+0

les objets n'ont pas de méthode 'forEach' – Alnitak

+0

votre droit, mis à jour – casraf

1

Vous pouvez utiliser la boucle for..in (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) en javascript pour faire défiler les propriétés d'un objet. En utilisant cela, vous pouvez tester la propriété name par rapport à la valeur donnée. Une fois que vous avez les deux propriétés, vous pouvez accéder aux valeurs de la propriété en les utilisant comme des indices.

var given = 4.3; 
var timeA = null; 
var timeB = null; 
for(var e in rock){ 
    if(e > given){ 
     timeB = e; 
     break; 
    } 
    timeA = e;  
} 
var valueA = rock[timeA]; 
var valueB = rock[timeB]; 

jsFiddle: http://jsfiddle.net/x4hzetw7/

Si vous voulez ce travail que vous attendez mais vous devez trouver un moyen de trier les propriétés. Pour ce faire, vous pouvez suivre le lien sur l'une des réponses précédentes (en utilisant Object.keys(obj)).

var given = 4.3; 
var timeA = null; 
var timeB = null; 
var keys = Object.keys(rock); 
var sorted = keys.map(Number).sort(function(a,b) {return a[0]-b[0];}); 
for(var i = 0; i < sorted.length; i++){ 
    var e = keys[i]; 
    if(e > given){ 
     timeB = e; 
     break; 
    } 
    timeA = e;  
} 
var valueA = rock[timeA]; 
var valueB = rock[timeB]; 

Mise à jour jsFiddle: http://jsfiddle.net/x4hzetw7/5/

+0

Cela suppose que les clés sont ordonnées du plus bas au plus haut, mais ce n'est pas garanti. –

+0

@ Ja͢ck C'est vrai. –

+0

@ Ja͢ck option triée, merci –