Суммируйте два значения в массиве объектов, затем вставьте в другой массив объектов - PullRequest
0 голосов
/ 12 октября 2018

У меня есть массив объектов, называемых магазинами:

stores = [
  {
    storeId: 1,
    city: "San Francisco",
    state: "CA",
  },
  {
    storeId: 2,
    city: "Seattle",
    state: "WA",
  },
  {
    storeId: 3,
    city: "Vancouver",
    state: "BC",
  },
  {
    storeId: 4,
    city: "Los Angeles",
    state: "CA",
  },
]

и другой массив объектов, называемых элементами:

items = [
  {
    itemId: 1,
    cost: 10,
    price: 20,
    sold: false,
    _storeId: 1,
  },
  {
    itemId: 2,
    cost: 10,
    price: 20,
    sold: false,
    _storeId: 1,
  },
  {
    itemId: 3,
    cost: 5,
    price: 12,
    sold: true,
    _storeId: 2,
  },
  {
    itemId: 4,
    cost: 12,
    price: 20,
    sold: false,
    _storeId: 3,
  },
  {
    itemId: 5,
    cost: 2,
    price: 10,
    sold: false,
    _storeId: 4,
  },
  {
    itemId: 6,
    cost: 10,
    price: 50,
    sold: true,
    _storeId: 4,
  },
]

Я хочу суммировать следующие категории по магазинам:

  • TotalCost
  • TotalPrice

Затем подсчитайте общее количество товаров по магазину:

  • TotalItems

Затем подсчитайте промежуточные товары, проданные в магазине:

  • SoldItems

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

storesUpdated = [
  {
    storeId: 1,
    city: "San Francisco",
    state: "CA",
    totalCost: 20,
    totalPrice: 40,
    countTotalItems: 2,
    countSoldItems: 0
  },
  {
    storeId: 2,
    city: "Seattle",
    state: "WA",
    totalCost: 5,
    totalPrice: 12,
    countTotalItems: 1,
    countSoldItems: 1
  },
  {
    storeId: 3,
    city: "Vancouver",
    state: "BC",
    totalCost: 12,
    totalPrice: 20,
    countTotalItems: 1,
    countSoldItems: 0
  },
  {
    storeId: 4,
    city: "Los Angeles",
    state: "CA",
    totalCost: 12,
    totalPrice: 60,
    countTotalItems: 2,
    countSoldItems: 1
  },
]

I 'мы пробовали отображать массив магазинов, но застряли здесь:

const storesUpdated = stores.map((store) => {
   = {}
  items.forEach(item => {
    if (item._storeId === store.storeId) {
      return totalCost {
        'storeId' : item.storeId,

      }
    }
  })
})

Есть идеи?Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы хотите зациклить свои данные один раз , вы можете выполнить объединение в два этапа:

  • Создать «пустые» хранилища и проиндексировать ихпо идентификатору за одно уменьшение: (один цикл над stores)

    const Store = (data) => ({ /* ... */ });
    const storesById = storeData => storeData.reduce(
      (map, sd) => Object.assign(map, { [sd.storeId]: Store(sd) }),
      {}
    );
    
  • Цикл по элементам и объединение их в соответствующее хранилище: (один цикл по items)

    const addItemToStoreMap = (storeMap, item) => ({
      ...storeMap,
      [item._storeId]: addItemToStore(storeMap[item._storeId], item)
    });
    

Обратите внимание, что создание всех новых объектов с использованием синтаксиса разброса объектов как бы сводит на нет повышение производительности, но все равно приятно, что вместо этого используется O (n + m)O (n * m).

Собираем все вместе:

const storeData = [{storeId:1,city:"San Francisco",state:"CA",},{storeId:2,city:"Seattle",state:"WA",},{storeId:3,city:"Vancouver",state:"BC",},{storeId:4,city:"Los Angeles",state:"CA",},]
const itemData = [{itemId:1,cost:10,price:20,sold:!1,_storeId:1,},{itemId:2,cost:10,price:20,sold:!1,_storeId:1,},{itemId:3,cost:5,price:12,sold:!0,_storeId:2,},{itemId:4,cost:12,price:20,sold:!1,_storeId:3,},{itemId:5,cost:2,price:10,sold:!1,_storeId:4,},{itemId:6,cost:10,price:50,sold:!0,_storeId:4,},]

const { Store, addItemToStoreMap, storesById } = storeUtils();

// Loop over the stores *once*, loop over the items *once*
// During the second loop, add items to the right stores
const itemsByStoreId = itemData.reduce(addItemToStoreMap, storesById(storeData));

console.log(Object.values(itemsByStoreId));

function storeUtils() {

  // Our client-side model for a Store
  const Store = ({ storeId, city, state }) => ({
    storeId,
    city,
    state,
    totalCost: 0,
    totalPrice: 0,
    countTotalItems: 0,
    countSoldItems: 0
  });

  // Merge logic for adding an item to a store
  // Can be used in a reduce on a list of items seeded with a store
  const addItemToStore = (store, item) => ({
    ...store,
    totalCost: store.totalCost + item.cost,
    totalPrice: store.totalPrice + item.price,
    countTotalItems: store.countTotalItems + 1,
    countSoldItems: store.countSoldItems + item.sold
  });

  // Selects the right store for an item and returns a new
  // map with the updated store
  const addItemToStoreMap = (storeMap, item) => ({
    ...storeMap,
    [item._storeId]: addItemToStore(storeMap[item._storeId], item)
  });

  // Converts raw data to Store objects and indexes them by their id
  const storesById = storeData => storeData.reduce(
    (map, sd) => Object.assign(map, { [sd.storeId]: Store(sd) }),
    {}
  );

  return { Store, addItemToStoreMap, storesById };
};
0 голосов
/ 12 октября 2018

const stores = [{storeId:1,city:"San Francisco",state:"CA",},{storeId:2,city:"Seattle",state:"WA",},{storeId:3,city:"Vancouver",state:"BC",},{storeId:4,city:"Los Angeles",state:"CA",},]
const items = [{itemId:1,cost:10,price:20,sold:!1,_storeId:1,},{itemId:2,cost:10,price:20,sold:!1,_storeId:1,},{itemId:3,cost:5,price:12,sold:!0,_storeId:2,},{itemId:4,cost:12,price:20,sold:!1,_storeId:3,},{itemId:5,cost:2,price:10,sold:!1,_storeId:4,},{itemId:6,cost:10,price:50,sold:!0,_storeId:4,},]

const storesUpdated = stores.map((store) => {
  const updatedStore = { ...store,
    totalCost: 0,
    totalPrice: 0,
    countTotalItems: 0,
    countSoldItems: 0
  }
  
  items.forEach(item => {
    if (item._storeId === store.storeId) {
      updatedStore.totalCost += item.cost
      updatedStore.totalPrice += item.price
      updatedStore.countTotalItems += 1
      updatedStore.countSoldItems += item.sold ? 1 : 0
    }
  })
  
  return updatedStore
})

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