firebase对象大小:如何用$忽略属性?

时间:2015-01-21 17:03:37

标签: javascript angularjs firebase angularfire angularjs-filter

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

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

它返回"错误"号码(我知道它是正确的,但在我们的情况下......) 该对象如下所示:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

.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;
  }
});

<强>演示

&#13;
&#13;
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;
  }
});
&#13;
<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>
&#13;
&#13;
&#13;