Ng-repeat фильтр для атрибута undefined

Я надеялся, что это будет действительно просто в angular.

У меня есть список с переводчиками и другими пользователями

[{user: 'a',languages:['french','english','spanish']},
{user: 'b'}]

Затем у меня есть ng-repeat, где я хочу показывать только тех, у кого есть языки

ng-repeat="translator in users | filter: {languages}"

но, к сожалению, я не могу понять, как фильтровать по наличию атрибута. Я пробовал всевозможные

{languages:'!undefined'}
{languages.length > 0}
{languages.length:'!0'}

Я не хочу писать для этого внешний фильтр, так как я уверен, что это возможно в angular, я просто не могу правильно получить жаргон.

Ответы

Ответ 1

<div ng-repeat="translator in users | filter : { languages : '!!' }">

Объяснение:

Рассмотрим список, как показано ниже:

$scope.items = [
    {
        propertyOne: 'a',
        propertyTwo: 'hello'
    },
    {
        propertyOne: 'b', 
        propertyTwo: null
    },
    {
        propertyOne: 'c', 
        propertyTwo: undefined
    },
    {
        propertyOne: 'd'
    }
];

'!!' отфильтровывает объекты, имеющие определенное свойство или объекты, имеющие определенное свойство, которое не является undefined или null:

<div ng-repeat="item in items | filter : { propertyTwo : '!!' }">
    {{item.propertyOne}}
</div>
<!-- outputs: a -->

'!' отфильтровывает объекты, не имеющие определенного свойства или объекты, имеющие определенное свойство undefined или null:

<div ng-repeat="item in items | filter : { propertyTwo : '!' }">
    {{item.propertyOne}}
</div>
<!-- outputs: b c d -->

Plnkr

Примечание. Он не работает для свойств со значениями, такими как 0, ложная или пустая строка ('').

EDIT: предыдущий ответ был отличным от примера plunkr. Я исправил их, заменив "!!" и "!".

Ответ 2

Контроллер:

var app = angular.module('app',[]);
app.controller('ctrl', function($scope) {
   $scope.hasLanguage = function(user) {
       return user.hasOwnProperty('languages');
    }
 });

HTML:

ng-repeat="translator in users | filter: hasLanguage"