我们有一个包含用户的对象'通知数据。我们如何忽略以$开头的所有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,因为对象没有子节点
答案 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;
}
});
<强>演示强>
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;