Как добавить ключи и нулевые значения с плавающей точкой к объектам в массиве объектов? - JavaScript - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть входной массив объекта и требуемый / выходной массив

Массив ввода объекта

var input = [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"TotalQty": "242.00"
}, 
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"TotalQty": "130.00"
}, 
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"TotalQty": "70.00"
}
];

У меня это как желаемый массив объекта

var output = [{
 "Grade": "AU27",
 "Thickness10Qty": "7.00",
 "Thickness5Qty": "19.20",
 "Thickness12Qty": "0.00",
 "Thickness8Qty": "0.00",
 "Thickness18Qty": "0.00",
 "Thickness22Qty": "0.00",
 "Thickness26Qty": "0.00",
 "TotalQty": "26.20"
 },
 {
  "Grade": "FE500D",
  "Thickness10Qty": "143.00",
  "Thickness12Qty": "69.00",
  "Thickness8Qty": "30.00",
  "Thickness5Qty": "0.00",
  "Thickness18Qty": "0.00",
  "Thickness22Qty": "0.00",
  "Thickness26Qty": "0.00",
  "TotalQty": "242.00"
 }, 
 {
  "Grade": "GE500D",
  "Thickness18Qty": "90.00",
  "Thickness22Qty": "40.00",
  "Thickness10Qty": "0.00",
  "Thickness12Qty": "0.00",
  "Thickness8Qty": "0.00",
  "Thickness5Qty": "0.00",
  "Thickness26Qty": "0.00",
  "TotalQty": "130.00"
  }, 
  {
   "Grade": "HE500D",
   "Thickness26Qty": "70.00",
   "Thickness18Qty": "0.00",
   "Thickness22Qty": "0.00",
   "Thickness10Qty": "0.00",
   "Thickness12Qty": "0.00",
   "Thickness8Qty": "0.00",
   "Thickness5Qty": "0.00",
    "TotalQty": "70.00"
   }
  ];

Что мне нужно сделать, так это предположить, что в первом объекте во входном массиве объекта, только Thickness10Qty и Thickness5Qty, поэтому я должен ввести другие ключи как 0. Я хочу, чтобы в каждом объекте было одинаковое количество ключей.Аналогично для последнего объекта во входном массиве объекта существует только Thickness26Qty.Таким образом, мы вставили другие ключи как 0, чтобы иметь равное количество ключей в каждом объекте.

Как я могу получить этот желаемый массив объектов с равным количеством ключей?

Ключи не могут быть жесткимизакодировано, это исходит от службы, служба может вернуть Thickness34Qty / Thickness46Qty вместо Thickness22Qty или Thickness38Qty вместо Thickness18Qty

Ответы [ 4 ]

1 голос
/ 18 апреля 2019

Вы можете создать шаблонный объект, для которого все ключи установлены на 0.00, который определяет, какие поля вы хотите, затем вы можете использовать Object.assign() внутри map(), чтобы объединить это с существующим объектом.

var input = [{"Grade": "AU27","Thickness10Qty": "7.00","Thickness5Qty": "19.20","TotalQty": "26.20"},{"Grade": "FE500D","Thickness10Qty": "143.00","Thickness12Qty": "69.00","Thickness8Qty": "30.00","TotalQty": "242.00"}, {"Grade": "GE500D","Thickness18Qty": "90.00","Thickness22Qty": "40.00","TotalQty": "130.00"}, {"Grade": "HE500D","Thickness26Qty": "70.00","TotalQty": "70.00"}];

// make template of all keys
let template  = input.reduce((obj, item) => (Object.keys(item).forEach(k => obj[k] = '0.00'), obj), {})

// apply to items:
let newArray = input.map(item => Object.assign({}, template, item))

console.log(newArray)
1 голос
/ 18 апреля 2019

Создайте массив всех ключей, которые должны быть в объекте, затем выполните итерацию по массиву объектов и добавьте все отсутствующие ключи со значением 0.00:

var input = [{
    "Grade": "AU27",
    "Thickness10Qty": "7.00",
    "Thickness5Qty": "19.20",
    "TotalQty": "26.20"
  },
  {
    "Grade": "FE500D",
    "Thickness10Qty": "143.00",
    "Thickness12Qty": "69.00",
    "Thickness8Qty": "30.00",
    "TotalQty": "242.00"
  },
  {
    "Grade": "GE500D",
    "Thickness18Qty": "90.00",
    "Thickness22Qty": "40.00",
    "TotalQty": "130.00"
  },
  {
    "Grade": "HE500D",
    "Thickness26Qty": "70.00",
    "TotalQty": "70.00"
  }
];

var keys = ["Grade", "TotalQty", "Thickness5Qty", "Thickness8Qty", "Thickness10Qty", "Thickness12Qty", "Thickness18Qty", "Thickness22Qty", "Thickness26Qty"];

var output = input.map(obj => {
  keys.forEach(key => obj[key] ? key : obj[key] = "0.00");
  return obj;
});

console.log(output);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Если ключи переменные (например, вы хотите, чтобы у каждого объекта были одинаковые ключи):

var input = [{
    "Grade": "AU27",
    "Thickness10Qty": "7.00",
    "Thickness5Qty": "19.20",
    "TotalQty": "26.20"
  },
  {
    "Grade": "FE500D",
    "Thickness10Qty": "143.00",
    "Thickness12Qty": "69.00",
    "Thickness8Qty": "30.00",
    "TotalQty": "242.00"
  },
  {
    "Grade": "GE500D",
    "Thickness18Qty": "90.00",
    "Thickness22Qty": "40.00",
    "TotalQty": "130.00"
  },
  {
    "Grade": "HE500D",
    "Thickness26Qty": "70.00",
    "TotalQty": "70.00"
  }
];

var keys = [...new Set(input.map(Object.keys).reduce((acc, curr) => acc.concat(curr)))];

var output = input.map(obj => {
  keys.forEach(key => obj[key] ? key : obj[key] = "0.00");
  return obj;
});

console.log(output);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 18 апреля 2019

Я думаю, что @ Марк-Мейер зарабатывает на этом. Я просто предложу чуть более читаемую версию.

    const baseObject = {
      "Thickness10Qty": "0.00",
      "Thickness5Qty": "0.00",
      "Thickness12Qty": "0.00",
      "Thickness8Qty": "0.00",
      "Thickness18Qty": "0.00",
      "Thickness22Qty": "0.00",
      "Thickness26Qty": "0.00",
      "TotalQty": "0.00"
    };

    const addMissingvalues = arr => arr.map(obj => ({
      ...baseObject,
      ...obj,
    }));
0 голосов
/ 18 апреля 2019

Это может не устанавливать какие-либо записи производительности, но должно демонстрировать шаги, которые происходят и как это может быть немного оптимизировано.Важно отметить, что работа с объектами приведет к изменению объектов в массиве input , поэтому нет массива ввода / вывода, поскольку для этого потребуется клонировать объекты и выполнить больше работы, чем требуется.

let array = getData()
normalizeData(array)
console.log('output:', array)

function normalizeData(array) {
  let stored_keys = {}
  
  array.forEach((obj, ndx, arr) => {
    let new_keys = []

    // create keys found in other objects
    Object.keys(stored_keys).forEach(key => {
      if (!(key in obj))
        obj[key] = "0.00"
    })

    // detect new keys
    Object.keys(obj).forEach(key => {
      if (!stored_keys[key]) {
        stored_keys[key] = true // track key
        new_keys.push(key)      // track new keys to apply to previous objects
      }
    })

    // add any new keys to previous objects
    if (new_keys.length)
      for (var i = 0, n = ndx; i < n; i++) {
        let prev_obj = arr[i];
        new_keys.forEach(key => prev_obj[key] = "0.00")
      }

  })
}


function getData() {
  return [{
      "Grade": "AU27",
      "Thickness10Qty": "7.00",
      "Thickness5Qty": "19.20",
      "TotalQty": "26.20"
    },
    {
      "Grade": "FE500D",
      "Thickness10Qty": "143.00",
      "Thickness12Qty": "69.00",
      "Thickness8Qty": "30.00",
      "TotalQty": "242.00"
    },
    {
      "Grade": "GE500D",
      "Thickness18Qty": "90.00",
      "Thickness22Qty": "40.00",
      "TotalQty": "130.00"
    },
    {
      "Grade": "HE500D",
      "Thickness26Qty": "70.00",
      "TotalQty": "70.00"
    }
  ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...