Нажмите / назначьте дочернюю строку JSON соответствующему родителю

1

У меня есть строка JSON, которая создается из API.

[{"categories":{"category":{"id":"1","Name":"furit"}}},{"categories":{"category":{"id":"2","Name":"veg"}}},{"products":{"product":{"id":"1","Name":"fruit"}}},{"products":{"product":{"id":"2","Name":"pears"}}}]

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

[{"categories":{"category":[{"id":"1","name":"fruit"},{"id":"2","name":"veg"}]}},{"products":{"products":[{"id":"1","name":"apple"},{"id":"2","name":"pears"}]}}]

Благодарю.

Обновленная структура данных

Теги:
object
arrays

2 ответа

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

Вы можете создать новый объект и использовать карту, чтобы изменить структуру данных и назначить эти данные новому объекту.

var data = [{"categories":{"category":{"id":"1","Name":"furit"}}},{"categories":{"category":{"id":"2","Name":"veg"}}}]
  
var r = {
  categories: {
    category: data.map(o => o.categories.category)
  }
}
console.log(r)

Обновлено Для новой структуры данных вы можете использовать цикл forEach() и добавить к объекту.

var data = [{"categories":{"category":{"id":"1","Name":"furit"}}},{"categories":{"category":{"id":"2","Name":"veg"}}},{"products":{"product":{"id":"1","Name":"fruit"}}},{"products":{"product":{"id":"2","Name":"pears"}}}]

var r = {categories: {category: []}, products: {product: []}}
data.forEach(function(e) {
  if(e.categories) r.categories.category.push(e.categories.category)
  if(e.products) r.products.product.push(e.products.product)
})

console.log(r)
  • 0
    отлично. Очень чистый. Что, если подобный объект «products» был в массиве данных, как мне это отобразить?
  • 0
    Не могли бы вы показать пример данных и ожидаемого результата.
Показать ещё 2 комментария
0

Вы можете использовать Array.prototype.reduce(), он уменьшит все объекты category элементов массива в одном массиве categories, давая ожидаемые результаты

Ваш код должен выглядеть так:

var result = data.reduce(function(a, b) {
  a[0].categories.push(b.categories);
  return a;
}, [{
  categories: []
}]);

Или если вы хотите, чтобы object как результат вместо array использовал его так:

var result = data.reduce(function(a, b) {
  a.categories.push(b.categories);
  return a;
}, {
  categories: []
});

Демо - версия:

var data = [{
    "categories": {
      "category": {
        "id": "1",
        "Name": "furit"
      }
    }
  },
  {
    "categories": {
      "category": {
        "id": "2",
        "Name": "veg"
      }
    }
  }
];

var result = data.reduce(function(a, b) {
  a[0].categories.push(b.categories);
  return a;
}, [{
  categories: []
}]);

console.log(result);

Редактировать:

Это изменение после добавления products к исходному объекту:

var result = data.reduce(function(a, b) {
  if(b.categories)
      a[0].categories.push(b.categories);
   if(b.products)   
       a[0].products.push(b.products);
  return a;
}, [{
  categories: [],
  products : []
}]);

Демо - версия:

var data = [{"categories":{"category":{"id":"1","Name":"furit"}}},{"categories":{"category":{"id":"2","Name":"veg"}}},{"products":{"product":{"id":"1","Name":"fruit"}}},{"products":{"product":{"id":"2","Name":"pears"}}}]
;

var result = data.reduce(function(a, b) {
  if(b.categories)
      a[0].categories.push(b.categories);
   if(b.products)   
       a[0].products.push(b.products);
  return a;
}, [{
  categories: [],
  products : []
}]);

console.log(result);

Ещё вопросы

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