Умножение 2 значений во вложенном массиве, а затем пересылка в новый массив - JavaScript Vue - PullRequest
0 голосов
/ 18 июня 2019

У меня есть массив, и я пытаюсь умножить два значения qty и packageQuantity, создавая новый массив с набором результатов, равным ключу units.

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

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

Я использую Vue, и хочу изменить значения, если это возможно, в реальном времени.

Как я могу сделать умножение, создавая новыймассив помещает результат в ключ единиц измерения?

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

Большое спасибо заранее!

Вот мой текущий массив:

data: () => ({
sites: [

  {
    sku: "10001",
    values: [
      {
        variationName: { name: "Unpackaged", qty: 1 },
        units: '',
        packageQuantity: '2'
      }
    ]
  },
  {
    sku: "10002",
    values: [
      {
        variationName: { name: "2 Pack", qty: 2 },
        units: '',
        packageQuantity: '3'
      },
      {
        variationName: { name: "4 Pack", qty: 4 },
        units: '',
        packageQuantity: '1'
      }
    ]
  }
    ]
})

Вот что я хочу, чтобы мой вывод был:

sites: [

  {
    sku: "10001",
    values: [
      {
        variationName: { name: "Unpackaged", qty: 1 },
        units: '2', // 1 * 2
        packageQuantity: '2'
      }
    ]
  },
  {
    sku: "10002",
    values: [
      {
        variationName: { name: "2 Pack", qty: 2 },
        units: '6', // 2 * 3
        packageQuantity: '3'
      },
      {
        variationName: { name: "4 Pack", qty: 4 },
        units: '4', // 1 * 4
        packageQuantity: '1'
      }
    ]
  }
    ]

Вот мой расчет:

 sites.forEach(
  (innerArray) => innerArray.values.forEach(
   (item => console.log(item.variationName.qty * item.units))
  )
 )

Ответы [ 3 ]

1 голос
/ 19 июня 2019
           let newData=[]; 
            let sites = [

                {
                    sku: "10001",
                    values: [{
                        variationName: {
                            name: "Unpackaged",
                            qty: 1
                        },
                        units: '',
                        packageQuantity: '2'
                    }]
                },
                {
                    sku: "10002",
                    values: [{
                            variationName: {
                                name: "2 Pack",
                                qty: 2
                            },
                            units: '',
                            packageQuantity: '3'
                        },
                        {
                            variationName: {
                                name: "4 Pack",
                                qty: 4
                            },
                            units: '',
                            packageQuantity: '1'
                        }
                    ]
                }
            ]
            for (let i = 0; i < sites.length; i++) {
                let iData = sites[i].values;
                for (let j = 0; j < iData.length; j++) {
                    iData[j].units = parseInt(iData[j].packageQuantity) * parseInt(iData[j].variationName.qty);
                }

            }
             newData.push(sites);

выход

    newData: [
            {
                sku: "10001",
                values: [{
                    variationName: {
                        name: "Unpackaged",
                        qty: 1
                    },
                    units: 2, 
                    packageQuantity: '2'
                }]
            },
            {
                sku: "10002",
                values: [{
                        variationName: {
                            name: "2 Pack",
                            qty: 2
                        },
                        units: 6,
                        packageQuantity: '3'
                    },
                    {
                        variationName: {
                            name: "4 Pack",
                            qty: 4
                        },
                        units: 4, 
                        packageQuantity: '1'
                    }
                ]
            }
        ]
0 голосов
/ 18 июня 2019

Вот что вы можете сделать:

const datum = {
  sites: [

    {
      sku: "10001",
      values: [
        {
          variationName: { name: "Unpackaged", qty: 1 },
          units: 5,
          packageQuantity: ""
        }
      ]
    },
    {
      sku: "10002",
      values: [
        {
          variationName: { name: "2 Pack", qty: 2 },
          units: 3,
        },
        {
          variationName: { name: "4 Pack", qty: 4 },
          units: 6,
          packageQuantity: ""
        }
      ]
    }
      ]
  };

const qtyCalculated = datum && datum.sites && datum.sites.reduce((acc, site) => {
  if (!acc["sku"]) {
    acc["sku"] = [];
  }
  acc["sku"].push(site.sku);
  if (!acc["qty"]) {
    acc["qty"] = [];
  }
  acc["qty"].push(...site.values && site.values.reduce((valueAcc, valueItem) => {
    valueAcc.push(valueItem.variationName.qty * parseInt(valueItem.units, 10));
    return valueAcc;
  }, []));
  return acc;
}, []);

console.log(qtyCalculated);

Вы можете добавить имя и рассчитать количество отдельно для каждого элемента значения.Я объявил единицы числом в датуме.Если вы используете строку, используйте parseInt, как указано выше.

0 голосов
/ 18 июня 2019

Вы можете взять то, что вы уже сделали, и назначить его на item.units.Но вы должны помнить, чтобы преобразовать значения в целые числа перед умножением.Вам также нужно будет преобразовать результат обратно в строку, если вам это нужно в виде строки.Вот как бы вы это сделали, если бы все значения были числами:

 sites.forEach(
    (innerArray) => innerArray.values.forEach(item => { 
       item.units = item.variationName.qty * item.units; 
    })
 )

Возможно, стоит отметить, что то, что вы назвали innerArray, на самом деле не массив, а фактически объект, поэтому вы можете захотетьНазовите это лучше для ясности.

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