Фильтр / Карта / Уменьшить правильно

Я пытаюсь отфильтровать пользователей JSON через JavaScript filter, map, а также reduce методы. Однако я не могу получить точный результат, который я притворяюсь.

var users = {
"fooUser": {
  "apps": [
    {
      "id": "7i2j3bk85"
    },
    {
      "id": "o8yasg69h"
    }
  ]
},
"barUser": {
  "apps": [
    {
      "id": "789gbiai7t"
    }
  ]
}};

Логика такова: я знаю только AppId (а не пользователя, к которому он относится), поэтому мне придется сопоставлять / фильтровать каждого пользователя и возвращать его ТОЛЬКО, если у него есть этот Appid (и возвращать ТОЛЬКО тот AppId).

var filteredApps = Object.keys(users).filter(function (element, index, array) {

  var exists = users[element].apps.filter(function (element, index, array) {

    if (element.id === 'o8yasg69h') {
      return true;
    } else {
      return false;
    }
  });

  if (exists[0]) {
    return true;
  } else {
    return false;
  }
}).map(function (item, index, array) {
  return users[item].apps;
});

console.log(filteredApps);

Я получаю (multiArray с нефильтрованными приложениями):

[[
  {
    id: "7i2j3bk85"
  },
  {
    id: "o8yasg69h"
  }
]]

Но я хотел бы получить (один простой объект с отфильтрованным приложением):

{
  id: "o8yasg69h"
}

2 ответа

Решение

Вы можете сделать это с помощью следующей строки:

[].concat(...Object.keys(users).map(x=> users[x].apps)).find(x=> x.id === "o8yasg69h")

Чтобы немного его расширить:

[].concat(...                    // flattens the array of apps
  Object.keys(users)             // gets the keys of users
   .map(x=> users[x].apps)       // maps the array to the apps of the user
).find(x=> x.id === "o8yasg69h") // finds app which id is "o8yasg69h"

Я бы сделал это с reduce и ES6 find:

function searchById(id){
    return Object.keys(users).reduce(function(result, user){
        return result ? result : users[user].apps.find(function(obj){
            return obj.id === id;
        });
    }, false);
}
Другие вопросы по тегам