简体   繁体   English

如何将键和零浮点值附加到对象数组中的对象? -Javascript

[英]How to append keys and zero float values to objects in array of objects ? - Javascript

I have an input array of object and a desired/output array 我有一个对象的输入数组和所需/输出数组

Input Array of object 输入对象数组

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"
}
];

I have this as the desired array of object 我将其作为所需的对象数组

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"
   }
  ];

What I have to do is that suppose in the first object in the input array of object, only Thickness10Qty and Thickness5Qty, so I have to enter other keys as 0. I want to have equal number of keys in every objects. 我要做的是假设在对象输入数组的第一个对象中,只有Thickness10Qty和Thickness5Qty,因此我必须将其他键输入为0。我希望每个对象中的键数相等。 Similarly for the last object in the input array of object, only Thickness26Qty exists. 类似地,对于对象输入数组中的最后一个对象,仅存在Thickness26Qty。 So we have insert other keys as 0 to have equal number of keys in every objects. 因此,我们将其他键插入为0,以在每个对象中具有相等数量的键。

How can I achieve this desired array of object with equal number of keys? 如何用相同数量的键实现所需的对象数组?

The keys cannot be hard coded, it is coming from a service, the service may return Thickness34Qty/Thickness46Qty instead of Thickness22Qty or Thickness38Qty instead of Thickness18Qty 密钥不能被硬编码,它来自服务,服务可能返回Thickness34Qty / Thickness46Qty而不是Thickness22Qty或Thickness38Qty而不是Thickness18Qty

Make an array of all the keys that should be in an object, then iterate through the array of objects, and add any keys that are missing, with the value 0.00 : 创建应包含在对象中的所有键的数组,然后遍历对象的数组,并添加所有缺失的键,其值为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; } 

If the keys are variable (eg you want every object to have the same keys): 如果键是可变的(例如,您希望每个对象都具有相同的键):

 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; } 

You could make a template object that has all the keys set to 0.00 which defines which fields you want, then you can use Object.assign() inside map() to merge this with your existing object. 您可以制作一个将所有键都设置为0.00的模板对象,以定义所需的字段,然后可以在map()使用Object.assign()将其与现有对象合并。

 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) 

This may not set any performance records, but should demonstrate the steps that occur and how it can be slightly optimized. 这可能不会设置任何性能记录,但是应该演示发生的步骤以及如何对其进行稍微优化。 It's important to note that operating on the objects will mutate the objects in the input array, so there is no input/output array as that would require cloning the objects and more work than is required. 重要的是要注意,对对象进行操作将使输入数组中的对象发生突变,因此没有输入/输出数组,因为这将需要克隆对象并且需要的工作量超出所需。

 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" } ]; } 

I think @mark-meyer is on the money with this one. 我认为@ mark-meyer与此有关。 I'll just offer a slightly more readable version. 我将提供一个更具可读性的版本。

    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,
    }));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM