Как получить элементы в функции карты для каждого идентификатора - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь получить некоторые данные с помощью Wordpress API, и мне нужно сделать это на основе базы отдыха и ID.

У меня есть массив, который выглядит следующим образом:

const array = [
    {
        taxonomy: 'category',
        rest_base: 'categories',
        id: [ 1, 2 ]
    },
    {
        taxonomy: 'post_tag',
        rest_base: 'tags',
        id: [ 4, 5, 6, 7 ]
    }
];

Это функция карты:

array.map( ({ rest_base, id }) => {
    console.log( rest_base ); // categories or tags
    console.log( id ); // array of id's

    // Do a call here for each id
});

Мне нужно каким-то образом получить все индивидуальные идентификаторы, чтобы я мог совершать такие звонки, как:

example.com/wp-json/wp/v2/<rest_base>/<id>

Кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Итерируйте внешний массив с Array.flatMap(), а массив id с Array.map() сделайте вызовы с fetch или подобными API, и вы получите массив обещаний:

const array = [{"taxonomy":"category","rest_base":"categories","id":[1,2]},{"taxonomy":"post_tag","rest_base":"tags","id":[4,5,6,7]}];

const result = array.flatMap( ({ rest_base, id }) => 
  id.map(v => `example.com/wp-json/wp/v2/${rest_base}/${v}`) // wrap the string with a fetch or similar function
);

console.log(result);

Если вы не можете использовать Array.flatMap(), используйте вложенный вызов Array.map() и выровняйте его, расширив в Array.concat():

const array = [{"taxonomy":"category","rest_base":"categories","id":[1,2]},{"taxonomy":"post_tag","rest_base":"tags","id":[4,5,6,7]}];

const result = [].concat(...array.map( ({ rest_base, id }) => 
  id.map(v => `example.com/wp-json/wp/v2/${rest_base}/${v}`) // wrap the string with a fetch or similar function
));

console.log(result);
0 голосов
/ 05 мая 2019

Возможно, я бы использовал Array.prototype.reduce для создания объекта, ключами которого являются ваши rest_base значения, а значения - соответствующие id значения. На этом вы можете просто повторить, как показано ниже:

const arr = [{
    taxonomy: 'category',
    rest_base: 'categories',
    id: [1, 2]
  },
  {
    taxonomy: 'post_tag',
    rest_base: 'tags',
    id: [4, 5, 6, 7]
  }
];

const map = arr.reduce((acc, val) => {return {...acc, [val.rest_base]: val.id}}, {});
/*
{
  "categories": [
    1,
    2
  ],
  "tags": [
    4,
    5,
    6,
    7
  ]
}
*/
for (const rest_base in map) {
  for (const id of map[rest_base]) {
    console.log(`example.com/wp-json/wp/v2/${rest_base}/${id}`) 
  }
}
/*
example.com/wp-json/wp/v2/categories/1
example.com/wp-json/wp/v2/categories/2
example.com/wp-json/wp/v2/tags/4
example.com/wp-json/wp/v2/tags/5
example.com/wp-json/wp/v2/tags/6
example.com/wp-json/wp/v2/tags/7
*/
0 голосов
/ 05 мая 2019

Вы можете использовать любую библиотеку http-запросов.Самый простой способ использовать API выборки браузера с помощью async / await:

const resultArray = array.map( async({ rest_base, id }) => {
    console.log( rest_base ); // categories or tags
    console.log( id ); // array of id's

    return id.map(id => await fetch(`example.com/wp-json/wp/v2/${rest_base}/${id}`));

});

Функция await вернет результат вызова.Таким образом, вы можете получать данные синхронно.Если вы можете получить асинхронность данных, вы можете создать массив обещаний и использовать Promise all:

const promiseArray = array.map( async({ rest_base, id }) => {
    console.log( rest_base ); // categories or tags
    console.log( id ); // array of id's

    return id.map(id => return fetch(`example.com/wp-json/wp/v2/${rest_base}/${id}`));
});

const result = Promise.all(promiseArray);
...