Javascript 按键值筛选json对象
我试图通过用户输入过滤json对象。用户将从下拉列表中选择一个数字,然后我希望过滤我的数据并将其返回给他们(通过d3地图)。所以我想我要做的是非常简单的——但我不太确定如何在javascript中做到这一点 我有一个用于选择列表的更改功能,用户在其中选择要过滤的号码,如下所示:Javascript 按键值筛选json对象,javascript,json,angularjs,lodash,Javascript,Json,Angularjs,Lodash,我试图通过用户输入过滤json对象。用户将从下拉列表中选择一个数字,然后我希望过滤我的数据并将其返回给他们(通过d3地图)。所以我想我要做的是非常简单的——但我不太确定如何在javascript中做到这一点 我有一个用于选择列表的更改功能,用户在其中选择要过滤的号码,如下所示: $scope.slideChange = function(data){ //filter $scope.myData here by data } json看起来是这样的(地震中只有一个对象,通常还有很多
$scope.slideChange = function(data){
//filter $scope.myData here by data
}
json看起来是这样的(地震中只有一个对象,通常还有很多):
地震是一系列的物体。我希望通过数据和它们各自的大小来过滤对象数组。因此,如果我收到5,我想过滤5.x量级的任何东西,超出5.x量级的任何东西都会从结果中过滤出来,保持原始结构。我可以使用lodash,我只是不太确定我会怎么做,因为这对我来说是新的。非常感谢您的帮助
这是我的第一张照片:
_.filter($scope.myData.earthquakes, function(item){
return item.magnitude == data;
});
这是不正确的。我希望恢复与开始时相同的结构—删除不符合筛选条件的项。您对
\uuFilter的调用。filter
不会就地筛选数组,而是克隆它并返回克隆,而您不做任何操作。因此,您应该将过滤后的数组重新分配回$scope.myData.sequences
以下是一个使用本机javascript的版本:
$scope.myData.earthquakes = $scope.myData.earthquakes.filter(function(eq) {
return eq.magnitude === data;
});
您必须存储原始阵列,然后对其进行筛选以生成克隆。否则,您将丢失原始数据 看看这个JSFIDLE 角度模块('test',[]) .controller('TestCtrl',['$scope',函数($scope){ 风险值数据={ “计数”:“349”, “地震”:[ { “src”:“美国”, “eqid”:“b0001mej”, “时间日期”:“2011-02-28 23:42:17”, “lat”:“-29.4456”, “lon”:“-112.0629”, “震级”:“5.1”, “深度”:“10.3”, “地区”:” }, { “src”:“美国”, “eqid”:“b0001mej”, “时间日期”:“2011-02-28 23:42:17”, “lat”:“-29.4456”, “lon”:“-112.0629”, “震级”:“1.1”, “深度”:“10.3”, “地区”:” }, { “src”:“美国”, “eqid”:“b0001mej”, “时间日期”:“2011-02-28 23:42:17”, “lat”:“-29.4456”, “lon”:“-112.0629”, “震级”:“5.3”, “深度”:“10.3”, “地区”:” }, { “src”:“美国”, “eqid”:“b0001mej”, “时间日期”:“2011-02-28 23:42:17”, “lat”:“-29.4456”, “lon”:“-112.0629”, “震级”:“2.1”, “深度”:“10.3”, “地区”:” } ] }; $scope.filter='all'; $scope.myData=\.filter(data.sequences,函数(项){ item.magnitude=parseFloat(item.magnitude); 返回item.magnity>=5&&item.magnity<6; }); $scope.$watch('filter',函数(值){ $scope.myData=data.1; if(值&&!isNaN(值)){ value=parseInt(值); $scope.myData=\.filter(data.sequences,函数(项){ item.magnitude=parseFloat(item.magnitude); 返回item.magnity>=值和item.magnity<(值+1); }); } }); }]);
这是否解释了所有匹配项?我现在只允许用户选择整数,因此如果他们选择5,我希望显示5内的任何内容,如5.2、5.8等。谢谢我可以通过添加一个parseInt来解决这个问题,以获取用于过滤的小数,比如return parseInt(eq.magnity)==data。谢谢你的帮助!这是一个完全不同的问题,但很高兴你能解决它。还有
Math.floor
删除任何数字的小数部分。但实际上,parseInt也做同样的事情,并接受字符串。
$scope.myData.earthquakes = $scope.myData.earthquakes.filter(function(eq) {
return eq.magnitude === data;
});
angular.module('test', [])
.controller('TestCtrl', ['$scope', function($scope) {
var data = {
"count": "349",
"earthquakes": [
{
"src": "us",
"eqid": "b0001mej",
"timedate": "2011-02-28 23:42:17",
"lat": "-29.4456",
"lon": "-112.0629",
"magnitude": "5.1",
"depth": "10.3",
"region": "."
},
{
"src": "us",
"eqid": "b0001mej",
"timedate": "2011-02-28 23:42:17",
"lat": "-29.4456",
"lon": "-112.0629",
"magnitude": "1.1",
"depth": "10.3",
"region": "."
},
{
"src": "us",
"eqid": "b0001mej",
"timedate": "2011-02-28 23:42:17",
"lat": "-29.4456",
"lon": "-112.0629",
"magnitude": "5.3",
"depth": "10.3",
"region": "."
},
{
"src": "us",
"eqid": "b0001mej",
"timedate": "2011-02-28 23:42:17",
"lat": "-29.4456",
"lon": "-112.0629",
"magnitude": "2.1",
"depth": "10.3",
"region": "."
}
]
};
$scope.filter = 'all';
$scope.myData = _.filter(data.earthquakes, function(item) {
item.magnitude = parseFloat(item.magnitude);
return item.magnitude >= 5 && item.magnitude < 6;
});
$scope.$watch('filter', function(value) {
$scope.myData = data.earthquakes;
if(value && !isNaN(value)) {
value = parseInt(value);
$scope.myData = _.filter(data.earthquakes, function(item) {
item.magnitude = parseFloat(item.magnitude);
return item.magnitude >= value && item.magnitude < (value + 1);
});
}
});
}]);