2016-04-11 8 views
14

mam obiektu podobnego dofiltr jQuery obiekt przez wartość z niespójnego indeksu

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 };

Próbuję filtrować na podstawie wartości za pomocą tego

$.filter(obj,function(i, value){ 
    return value>3; 
}); 

Jednak ten wraca pusty.

wyjście Oczekiwany {'Sand': 4 }

Czy istnieje sposób, aby filtrować według wartości, gdy indeksy obiektów nie może być skierowana konsekwentnie i mogą się różnić.

+2

Jakie są pożądane wyniki? –

+0

@ZakariaAcharki Zaktualizowałem go oczekiwanym wyjściem – Joel

+1

Nie powinieneś używać jQuery, aby to zrobić. Jest to łatwa operacja z natywnym JavaScriptem i będzie również szybsza. Spójrz na odpowiedzi poniżej. –

Odpowiedz

6

Spróbuj coś takiego ..

function filterObjectProperties(obj, filtercb){ 
    var ret = {}; 
    for(var p in obj) 
     if(obj.hasOwnProperty(p)) 
      if(filtercb(obj[p])) 
       ret[p] = obj[p]; 
    return ret; 
} 

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 

var newObj = filterObjectProperties(obj, function(val){ 
    return val > 3; 
}); 

https://jsfiddle.net/dht2L55L/

+0

Czy .keys() byłaby bardziej wydajna, ponieważ pętla for-in wylicza również właściwości w łańcuchu prototypów? Nie przetestowałem tego przypuszczenia. –

+0

masz rację, to także pętle właściwości prototypu, dlatego użyłem 'hasOwnProperty()', która odfiltrowuje właściwości prototypu. –

+0

można również użyć 'keys()', ale jest mniej przenośny. musisz dodać polyfill dla starych przeglądarek. –

2

Można to zrobić bez $.filter:

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 
result = {}; 
for (var k in obj) { 
    if (obj[k] > 3) { 
     result[k] = obj[k]; 
    } 
} 
console.log(result); 
+0

Czy funkcja '.keys()' będzie bardziej wydajna, ponieważ pętla for-in wylicza również właściwości w łańcuchu prototypów? Nie przetestowałem tego przypuszczenia. –

1

Ty mogłaś jQuery.each(). Aby użyć JQuery.filter i JQuery.grep, myślę, że twój obiekt powinien być inny.

$(function(){ 

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 

var result = null; 

$.each(obj, function(key, value) { 
    if(value > 3){ 
    result = key; 
    } 
}); 

console.log(result); 

}); 
0
var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 

function filterObj(obj, valueThreshold) { 
    var keys = Object.keys(obj); 
    var result = {}; 
    keys.forEach(function(key) { 
    var value = obj[key]; 
    if (value > valueThreshold) { 
     result[key] = value; 
    } 
    }) 
    return result; 
} 

console.log('obj: ' + JSON.stringify(obj)); 
var filteredObj = filterObj(obj, 3); 
console.log('filterdObj: ' + JSON.stringify(filteredObj)); 
1

powinno być tak proste, jak

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 

var result = Object.keys(obj) 
    .filter(function(e) { return obj[e] > 3 }) 
    .reduce(function(object, property) { 
     return (object[property] = obj[property], object); 
    }, {}) 

bez biblioteki

1

Nie ma natywny filter do obiektu Object, ale jak o tym:

var obj = { 'Earth': 1, 'Sky': 2, 'Tree': 3, 'Sand': 4 }; 
 
newObject = {} 
 
Object.keys(obj).map(function(value, index) { 
 
    if (obj[value]>3){ 
 
     newObject[value] = obj [value] 
 
    } 
 
}); 
 
snippet.log(newObject); 
 
// => {'Sand': 4 }
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Powiązane problemy