Фильтрация данных JSON на основе определенных свойств и значений

0

У меня есть следующий объект JSON:

{
  'name' : 'John',
  'friends' : [
    {
      'id' : 1,
      'name' : 'George',
      'level' : 10
    },
    {
      'id' : 2,
      'name' : 'Stacy',
      'level' : 8
    },
    {
      'id' : 3,
      'name' : 'Fred',
      'level' : 10
    },
    {
      'id' : 4,
      'name' : 'Amy',
      'level' : 7
    },
    {
      'id' : 5,
      'name' : 'Bob',
      'level' : 10
    }
  ]
}

Итак, как вы видите, у вас есть объект (человек?), Который имеет name и массив объектов- friend. У каждого объекта-друга есть id, name и level.

То, что я хотел бы сделать, - выбрать всех друзей уровня 10 из этого массива и в другую переменную/объект, называемый var level10Friends.

Я использую AngularJS, и все это должно произойти в моем контроллере, но это необязательно должно быть проблемой AngularJS, вы также можете использовать функции ванильного JavaScript.

Честно говоря, я даже не знаю, возможно ли это, и поиск в Интернете, похоже, ничего не говорит о чем-то подобном...

  • 1
    Вы пробовали что-нибудь? Или ожидаете, что кто-то сделает это для вас?
  • 0
    Это очень заметно с вашей стороны. Но если я даже не знаю, возможно ли это, и вы искали в Интернете более часа, с чего бы вам начать? Стоит упомянуть, что я ищу ванильный JavaScript или Angular способ сделать это.

5 ответов

13
Лучший ответ

Используйте Array.prototype.filter(). Метод filter() создает новый array со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

var users = {
  'name': 'John',
  'friends': [{
    'id': 1,
    'name': 'George',
    'level': 10
  }, {
    'id': 2,
    'name': 'Stacy',
    'level': 8
  }, {
    'id': 3,
    'name': 'Fred',
    'level': 10
  }, {
    'id': 4,
    'name': 'Amy',
    'level': 7
  }, {
    'id': 5,
    'name': 'Bob',
    'level': 10
  }]
};
var wantedData = users.friends.filter(function(i) {
  return i.level === 10;
});
console.log(wantedData);
1

Используя функции стрелок, вы можете сделать это как:

var filteredFriends = list.friends.filter( p => p.level === 10 );
1

Попробуй это:

var level10friends = list.friends.filter(function(p){return p.level == 10;});
0

Взгляни!

angular
  .module('test', [])
  .value('user', {
  'name' : 'John',
  'friends' : [{
      'id' : 1,
      'name' : 'George',
      'level' : 10
    },
    {
      'id' : 2,
      'name' : 'Stacy',
      'level' : 8
    },
    {
      'id' : 3,
      'name' : 'Fred',
      'level' : 10
    },
    {
      'id' : 4,
      'name' : 'Amy',
      'level' : 7
    },
    {
      'id' : 5,
      'name' : 'Bob',
      'level' : 10
    }]
  })
  .controller('TestCtrl', function TestCtrl($scope, user) {
    var vm = $scope;
    vm.level10friends = (function(friends, REQUIRED_LEVEL) {
      var res = [];
      
      for(var friend, i = 0, len = friends.length; i < len; i++) {
        friend = friends[i];
        
        if(friend.level === REQUIRED_LEVEL) {
          res.push(friend);
        }
        
      }
      
      return res;
    }).call(this, user.friends || [], 10);
  })
;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<article ng-app="test">
  <div ng-controller="TestCtrl">
    <div ng-bind="level10friends | json"></div>
  </div>  
</article>
0

Просто нашла этот плагин сегодня утром http://linqjs.codeplex.com/

Его способ запросить JSON с помощью функции linq. Я ЛЮБЛЮ ЭТО ^^

РЕДАКТИРОВАТЬ:

маленький пример для вашего случая:

var jsonArray = {your-json-array}
var level10Friends = Enumerable.From(jsonArray)
    .Where("$.user.level == 10")
    .Select("$.user.name")
    .ToArray();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню