Изменение массива объекта - PullRequest
1 голос
/ 09 ноября 2019

Я изменяю массив products , и в этом я изменяю container объект одного элемента массива, скажем, products [0] . Я назначаю новый объект для объекта контейнера 0-го элемента продукта. Код приведен ниже. Но вместо обновления объекта контейнера в данный новый объект он устанавливает его в массив.

См. Элемент по индексу 0 массива товаров. Вот где я устанавливаю контейнер объект для нового объекта. Но здесь он устанавливает массив для контейнера объекта. Смотрите код ниже. А также посмотрите контейнер объект элемента с индексом 1 . При индексе 1 это правильно.

(10) products = [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0:   container: (2) [{…}, {…}]
     id: 15
     markup_factor: "1.30"
     name: "Sohil Test Product"
     private: false
     profit_factor: "3.00"
     recipe: {id: 1, user: null, ingredients: Array(2), unit: "g", quantity: 4, …}
     sales_tax: "12.00"
     tags: [{…}]
     total_price: 17.47
     user: 3
     __proto__: Object

1:   container: {user: null, id: 22, components: Array(1), currency: "EUR", total_price: 0.15, …}
     id: 16
     markup_factor: "4.00"
     name: "demo product 24"
     private: false
     profit_factor: "4.00"
     recipe: {id: 38, user: 3, ingredients: Array(1), unit: "g", quantity: 0, …}
     sales_tax: "0.00"
     tags: []
     total_price: "9.12"
     user: 3
     __proto__: Object
2: {id: 21, user: 3, name: "DEMO PRODUCT", tags: Array(1), sales_tax: "2.00", …}
3: {id: 22, user: 3, name: "product 2", tags: Array(0), sales_tax: "4.00", …}
4: {id: 23, user: 3, name: "new product coming", tags: Array(1), sales_tax: "3.00", …}
5: {id: 24, user: 3, name: "new product", tags: Array(1), sales_tax: "0.00", …}
6: {id: 25, user: 3, name: "new product", tags: Array(2), sales_tax: "0.00", …}
7: {id: 26, user: 3, name: "sample test", tags: Array(0), sales_tax: "0.00", …}
8: {id: 27, user: 3, name: "new product demo", tags: Array(0), sales_tax: "0.00", …}
9: {id: 28, user: 3, name: "new product 3", tags: Array(0), sales_tax: "1.00", …}
length: 10
__proto__: Array(0)

Код мутации:

export const updateSelectedProduct = selectedContainer => (dispatch, getState) => {

  let { selectedProduct } = getState().product;
  let { products } = getState().product;
  for (var productList = 0; productList < products.length; productList++) {
    if (products[productList].id === selectedProduct.id) {
      const containerObj = {
        components: selectedContainer,
        currency: products[productList].container.currency,
        id: products[productList].container.id,
        name: null,
        user: null

      };  


       products[productList].container = containerObj;


    }
  }

};

1 Ответ

0 голосов
/ 09 ноября 2019

Похоже, у вас первый элемент имеет тип массива:

container: (2) [{…}, {…}]

, а второй элемент - объект:

container: {user: null, id: 22, components: Array(1), currency: "EUR", total_price: 0.15, …}

Так вот почему он устанавливает егов массив.

Что вы можете сделать, это получить объект, а не массив для вашего первого элемента, и тогда ваш код будет работать. Позвольте мне показать пример:

const products = [
  {
 container : [{id: 1, currency: 'USD'}, {test: 'Hello, World:)'}],
 id: 15,
 markup_factor: "1.30",
 name: "Sohil Test Product",
 private: false,
 profit_factor: "3.00",
 recipe: {id: 1, user: null, ingredients: [], unit: "g", quantity: 4, },
 sales_tax: "12.00",
 tags: [{}],
 total_price: 17.47,
 user: 3
},
{
 container : {id: 2, currency: 'Another Currency'},
 id: 16,
 markup_factor: "4.00",
 name: "demo product 24",
 private: false,
 profit_factor: "4.00",
 recipe: {id: 38, user: 3, ingredients: [], unit: "g", quantity: 0, },
 sales_tax: "0.00",
 tags: [],
 total_price: "9.12",
 user: 3,
},
{id: 21, user: 3, name: "DEMO PRODUCT", tags: [], sales_tax: "2.00", },
{id: 22, user: 3, name: "product 2", tags: [], sales_tax: "4.00", },
{id: 23, user: 3, name: "new product coming", tags: [], sales_tax: "3.00", },
{id: 24, user: 3, name: "new product", tags: [], sales_tax: "0.00", },
];


products.forEach((el, index) => {
  let container = null;
  let containerObj = null;
  if (Array.isArray(el.container)
&& el.container.some(c=> c.currency && c.id)) {
container = el.container.find(c => c.currency && c.id);
containerObj = {
  components: container,
  currency: container.currency,
  id: container.id,
  name: null,
  user: null
};
  } else if(products[index].container && products[index].container.currency) {
containerObj = {
  components: el,
  currency: products[index].container.currency,
  id: products[index].container.id,
  name: null,
  user: null
};
  }
  products[index].container = containerObj;
});
console.log(products)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...