2016-04-11 42 views
14

我有類似的jQuery濾鏡對象的值不一致指數

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

我想基於價值篩選使用此

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

然而這是返回空的對象。

預期輸出 {'Sand': 4 }

有一種由值來過濾,當對象的索引不能一貫地解決,並且可以變化。

+2

你想要的輸出是什麼? –

+0

@ZakariaAcharki我用預期的輸出更新了它 – Joel

+1

你不應該使用jQuery來做到這一點。使用原生JavaScript是一項簡單的操作,而且速度也會更快。看看下面的答案。 –

回答

6

嘗試這樣的事情..

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

.keys()會更有效,因爲for-in循環枚舉了原型鏈中的屬性?我沒有測試這個假設。 –

+0

你是對的,它也循環原型屬性,這就是爲什麼我使用'hasOwnProperty()',它過濾出原型屬性。 –

+0

你也可以使用'keys()',但它不太方便。您需要爲舊瀏覽器添加一個polyfill。 –

2

這可以在不$.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

'.keys()'會更有效率,因爲for-in循環枚舉了原型鏈中的屬性?我沒有測試這個假設。 –

1

你可能在你JQuery.each()。要使用JQuery.filter和JQuery.grep,我認爲你的對象應該是不同的。

$(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

應儘可能簡單

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); 
    }, {}) 

沒有任何圖書館

1

沒有原生filterObject對象,但這個怎麼樣:

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>