Javascript 按键值筛选json对象

Javascript 按键值筛选json对象,javascript,json,angularjs,lodash,Javascript,Json,Angularjs,Lodash,我试图通过用户输入过滤json对象。用户将从下拉列表中选择一个数字,然后我希望过滤我的数据并将其返回给他们(通过d3地图)。所以我想我要做的是非常简单的——但我不太确定如何在javascript中做到这一点 我有一个用于选择列表的更改功能,用户在其中选择要过滤的号码,如下所示: $scope.slideChange = function(data){ //filter $scope.myData here by data } json看起来是这样的(地震中只有一个对象,通常还有很多

我试图通过用户输入过滤json对象。用户将从下拉列表中选择一个数字,然后我希望过滤我的数据并将其返回给他们(通过d3地图)。所以我想我要做的是非常简单的——但我不太确定如何在javascript中做到这一点

我有一个用于选择列表的更改功能,用户在其中选择要过滤的号码,如下所示:

$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); 
            });
        }
    });
}]);