Как получить информацию от одного объекта json с ключом другого объекта json? - PullRequest
1 голос
/ 04 мая 2020

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

В частности, мне нужно получить имя из членства, используя данные, хранящиеся в локальном хранилище (membersSubscription.membership.id)

Данные корзины

Данные для элементов в корзине - это массив объектов из локального хранилища

var basketContentsObject = jQuery.parseJSON(localStorage.getItem('localBasket'));
var membershipSubscriptions =  basketContentsObject.data.membershipSubscriptions;

{
    autoRenew: true
    discount: 0
    expiryDate: "2021-05-03T00:00:00"
    id: "3807760AVVTBVCNPQVDKKCGMRBLGLCGRP"
    isRenewal: false
    membership: {
        id: "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK"
    }
    price: 47
    startDate: "2020-05-04T00:00:00"
    total: 47
}

Данные о членстве

json из API, который содержит больше информации об этом элементе - этот идентификатор также является массивом объектов

$.getJSON( cache_url + "memberships.json", function(membership) {
    console.log(ms);
});

{
    "description": "Patrons - paying £250 annually",
    "htmlDescription": "<div id>\r\n\t<h2>Patron £250 -  Paying annually</h2>\r\n</div>",
    "id": "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK",
    "imageUrl": "",
    "name": "Patrons - £250 Yearly",
    "thumbnailUrl": "",
    "attribute_Type": "Patrons"
}

Ответы [ 2 ]

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

Здесь я отображаю данные из API и соединяю ключи от объекта в локальном хранилище, который имеет тот же идентификатор, что и текущий объект из API.

 api.map((obj) => ({ ...obj, ...ls.find(({membership: {id}}) => id === obj.id)}))

Есть две вещи, которые вы должны посмотрите, если вы не знаете о них. Object Deconstruction и Spread Operator. Кроме того, у нас есть map и find, на которые стоит обратить внимание.

Вот полный рабочий пример:

const ls = [{
  autoRenew: true,
  discount: 0,
  expiryDate: "2021-05-03T00:00:00",
  id: "3807760AVVTBVCNPQVDKKCGMRBLGLCGRP",
  isRenewal: false,
  membership: {
    id: "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK",
  },
  price: 47,
  startDate: "2020-05-04T00:00:00",
  total: 47,
}]

const api = [{
  attribute_Type: "Patrons",
  description: "Patrons",
  id: "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK",
  imageUrl: "",
  name: "Patrons",
  thumbnailUrl: "",
}]

console.log(
  api.map((obj) => ({apiID: obj.id, ...obj,
    ...ls.find(({
      membership: {id}
    }) => id === obj.id)
  }))
)

Но вы, конечно, можете сделать это и наоборот.

const ls = [{
  autoRenew: true,
  discount: 0,
  expiryDate: "2021-05-03T00:00:00",
  id: "3807760AVVTBVCNPQVDKKCGMRBLGLCGRP",
  isRenewal: false,
  membership: {
    id: "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK",
  },
  price: 47,
  startDate: "2020-05-04T00:00:00",
  total: 47,
}]

let api = [{
  attribute_Type: "Patrons",
  description: "Patrons",
  id: "7ALGBGVBCLVTGKNVNRTJPVKGBSPNGQPMK",
  imageUrl: "",
  name: "Patrons",
  thumbnailUrl: "",
}]

console.log(
  ls.map((obj) => ({basketID: obj.id, ...obj,
    ...api.find(({
      id
    }) => id === obj.membership.id)
  }))
)
0 голосов
/ 04 мая 2020

Вам необходимо сохранить идентификатор членства в переменной, а затем выполнить итерацию данных членства в поисках совпадения в поле идентификатора.

Это может выглядеть примерно так:

const member = "3807760AVVTBVCNPQVDKKCGMRBLGLCGRP";
const memberData = membershipData.find(item => item.id === member);

Для этого нужно выполнить итерацию массива объектов «Данные о членстве» и для каждого объекта в массиве проверить, соответствует ли свойство id идентификатору члена, который вы ищете. Если совпадение найдено, весь объект будет возвращен и будет доступен в переменной memberData. Если совпадения не найдены, он вернет null.

Если может быть несколько совпадений и вам нужны все из них, используйте filter вместо find, в этом случае memberData будет массив.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...