javascript - 通过 Angular Factory 在 Javascript 中进行过滤、切片、排序

标签 javascript arrays angularjs object filter

我正在尝试创建一个数据项列表,这些数据项首先按值过滤,然后按降序值排序,然后切片以仅显示前 5 个项目。我使用 Angular 工厂将这些值返回到我的 Controller ,以便我可以在 DOM 中显示这些值。

我已成功对数据进行排序和切片,但在运行 dataHandler.filter 时遇到问题。我收到错误:'Cannot read property 'slice' of undefined' .

这是我的 Controller ,我在运行每个函数后尝试返回一个新列表:

Controller

getData().then(function(data) {

    function updateChart() {
        // get match value
        var filterValue = inputService.primaryInputs[0]["value"];

        // plug match value into filter ** should return only data items with matches
        var filtered = dataHandler.filter(data, "Description", filterValue);

        // sort by descending value "percent"
        var sorted = dataHandler.sort.descending(filtered, "Percent");

        // return top 5 results
        var sliced = dataHandler.slice(sorted, 5);
        $scope.barData = sliced;
    }
    updateChart();

});

我知道dataHandler.sort.descendingdataHandler.slice或工作正常,因为我可以使用 data作为 dataHandler.sort.descending 中的参数并且列表完美返回。但是,当我尝试插入使用 filtered ,我得到'Cannot read property 'slice' of undefined' .

工厂

app.factory('dataHandler', function ($rootScope) {
    return {
        filter: function(data, dataProp, input) {
            data.filter(function(value, index, array) {
                console.log(value[dataProp] == input);
                return value[dataProp] == input;
            });
        },
        sort: {
            ascending: function (data, sortCriteria) {
                if (data) {
                    data.sort(function (a, b) {
                        return a[sortCriteria] - b[sortCriteria];
                    });
                };
                return data;
            },
            descending: function (data, sortCriteria) {
                if (data) {
                    data.sort(function (a, b) {
                        return b[sortCriteria] - a[sortCriteria];
                    });
                };
                return data;
            }
        },
        slice: function (data, howMany) {
            if (howMany) {
                return data.slice(0, howMany);
            } else {
                return data;
            }
        }
    };

再次 - 我想使用dataHandler.filter返回一个新列表,其中仅包含 Description 的项目值与 filterValue 匹配.

最佳答案

它不起作用的原因是您没有在 dataHandler.filter 函数中返回任何内容。

应该是:

filter: function(data, dataProp, input) {
  return data.filter(function(value, index, array) {
    console.log(value[dataProp] == input);
    return value[dataProp] == input;
  });
}

请记住Array.prototype.filter无法正常工作,例如 Array.prototype.reverse .

<小时/>

尽管这可行,但我建议您实际上并不需要工厂来完成这些任务。过滤、切片和排序是非常通用的任务,不需要包装 native 实现(除非您要进行填充)。

我会将整个工厂重写为可重用转换函数的服务,可用于一系列链式操作。

.service('Transform', function() {
  // we will pass this to filter
  this.propEquals = function(property, value) {
    return function(data) {
      return data[property] === value;
    };
  };

  // we'll pass this to sort
  this.sort = function(criteria, ascending) {
    return function(a, b) {
      return ascending?
        a[criteria] - b[criteria] : b[criteria] - a[criteria];
    };
  };
})

然后你的 updateChart 方法就变成了。

function updateChart() {
  var filterValue = inputService.primaryInputs[0]["value"];

  $scope.barData = data
    .filter(Transform.propEquals("description", filterValue))
    .sort(Transform.sort("Percent", false))
    .slice(0, 5);
}

关于javascript - 通过 Angular Factory 在 Javascript 中进行过滤、切片、排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464567/

相关文章:

javascript - 悬停时更改父 div 上的文本?

python - 当一种数据类型是对象时,numpy 掩码数组的行为有所不同

javascript - 将复杂对象从 Angular JS 传递到 Web api 它总是返回 404

javascript - 当每次不同的值是预期行为时如何防止 "Error: $rootScope:infdig"

angularjs - Angular 类型错误 : Cannot read property 'then' of undefined

javascript - 防止 iOS 键盘在 cordova 3.5 中滚动页面

javascript - 为什么我的函数不显示数据?

javascript - 工作箱缓存版本控制最佳实践

php - 只进行一次查询并将其存储在数组中或每次都进行查询是否更有效?

php - 使用php mysql在单个表中进行多项选择