firebase 对象大小:如何忽略带有 $ 的属性?

firebase object size: how to ignore properties with $?

我们有一个包含用户通知数据的对象。我们如何忽略所有以 $ 开头的 firebase 键?因为在用

计算对象的大小时
.filter('keylength', function() {
return function(input) {
    if (!angular.isObject(input)) {
        throw Error("input was not an object!")
    }
    return Object.keys(input).length;
}
})

它 return 是 "wrong" 号码(我知道这是正确的,但在我们的例子中......) 对象看起来像这样:

$$conf: Object
$id: "notifications"
$priority: null
$value: null
__proto__: Object

过滤器 returns "1",它应该 return 0 因为对象没有子节点

Object.keys returns 数组,然后您可以按照自己喜欢的方式对其进行过滤:

return Object
    .keys(input)
    .filter(function(item) { return item.indexOf('$') != 0; })
    .length;

请注意,此解决方案与 Firebase、AngularJS 或 AngularFire 无关。是纯粹的JavaScript.

您可以在过滤器中过滤掉它们。

.filter('keylength', function() {
  var ignoreExp = /^$+/;
  return function(input) {
    if (!angular.isObject(input)) {
      throw Error("input was not an object!")
    }

    return Object.keys(input).filter(function(key) {
      //This is what angular does in angular.copy
      //return (key.charAt(0) !== '$' && key.charAt(1) !== '$');
      //Or just Filter out the ones that starts with any number of $
      return !ignoreExp.test(key); 
    }).length;
  }
});

演示

angular.module('app', []).controller('ctrl', function($scope) {
  
  $scope.obj = {
    $$conf: {},
    $id: "notifications",
    $priority: null,
    $$value: null,
    test:"hey"
  };
}).filter('keylength', function() {
  var ignoreExp = /^$+/;
  return function(input) {
    if (!angular.isObject(input)) {
      throw Error("input was not an object!")
    }
 
    return Object.keys(input).filter(function(key) {
      //return (key.charAt(0) !== '$' && key.charAt(1) !== '$');
      return !ignoreExp.test(key)
    }).length;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  Length={{obj|keylength}}
</div>