简体   繁体   English

javascript中的数组数组到对象数组的数组

[英]Array of array of array to array of objects in javascript

I would like to convert my array of array of objects to array of objects.我想将我的对象数组转换为对象数组。

I would like to merge two data into one.我想将两个数据合并为一个。 I have a data holder which is an array我有一个数据持有者,它是一个数组

const dataholder = ["itemCode","item","cashier"];

and a data that needs to map in dataholder key和一个数据需要dataholder在数据持有者密钥

const record = [
        {
          itemCode: { value: 1},
          item: { value: 'Pen'},
          cashier: {value: 'Sam'}
        },
        [
          itemCode: {value: 2},
          item: {value: 'Eraser'},
          cashier: {value: 'Kim'}
        ]
    ];

I have tried this code below but it the result turns to array of array of array我在下面尝试过这段代码,但结果变成了数组数组的数组

record?.map( item => {
        return dataholder ?.map( (field) => {
            return {
                [field]: item[field]?.value
            }
        })
    })

and here's the output这是 output

       [
        [
          {'itemCode': 1},
          {'item': 'Pen'},
          {'cashier': 'Sam'}
        ],
        [
          {'itemCode': 2},
          {'item': 'Eraser'},
          {'cashier': 'Kim'}
        ]
]

expected result预期结果

[
        {
            itemCode: 1,
            item: 'Pen',
            cashier: 'Sam'
        },
        {
            itemCode: 2,
            item: 'Eraser',
            cashier: 'Kim'
        }
    ]

Thanks for the help in advance!我在这里先向您的帮助表示感谢!

Try this:尝试这个:

record?.map(item => {
  const obj = {}
  for (const key in item)
      if (dataholder.includes(key))
        obj[key] = item[key].value
  return obj
})

You can .map() over your record objects, and for each object, map over your dataholder array to create an array of [key, obj[key].value] arrays.您可以.map()覆盖您的record对象,并为每个 object、map 覆盖您的dataholder数组,以创建[key, obj[key].value] arraysZ 的数组。 This will result in your inner .map() creating an array of the form...这将导致您的内部.map()创建表单的数组...

[[key, value], [key2, value2], ...]

... for each object ( obj ) that is iterated on by your outer .map() , where the value is obtained from the obj . ...对于由外部.map()迭代的每个 object ( obj ),其中值是从obj获得的。 You can then use Object.fromEntries() to convert this array of key-value pair entries into an object:然后,您可以使用Object.fromEntries()将此键值对条目数组转换为 object:

 const dataholder = ["itemCode","item","cashier"]; const record = [ { itemCode: { value: 1}, item: { value: 'Pen'}, cashier: {value: 'Sam'} }, { itemCode: {value: 2}, item: {value: 'Eraser'}, cashier: {value: 'Kim'} } ]; const res = record.map(obj => Object.fromEntries( dataholder.map(key => [key, obj[key].value]) )); console.log(res);

Instead, in the inner loop, you could use reduce相反,在内部循环中,您可以使用reduce

const res = record.map((item) => {
  return dataholder.reduce((acc, field) => {
    return {
      ...acc,
      [field]: item[field].value,
    };
  }, {});
});

 const dataholder = ["itemCode", "item", "cashier"]; const record = [ { itemCode: { value: 1 }, item: { value: "Pen" }, cashier: { value: "Sam" }, }, { itemCode: { value: 2 }, item: { value: "Eraser" }, cashier: { value: "Kim" }, }, ]; const res = record.map((item) => { return dataholder.reduce((acc, field) => { return {...acc, [field]: item[field].value, }; }, {}); }); console.log(res);

You can try this way (using .map combines with for... of )您可以尝试这种方式(使用.map结合for... of

var result = record.map(r => {
  var item = {};
  for(let key of dataholder)  item[key] = r[key].value;
  return item;
});

 var dataholder = ["itemCode","item","cashier"]; var record = [ { itemCode: { value: 1}, item: { value: 'Pen'}, cashier: {value: 'Sam'} }, { itemCode: {value: 2}, item: {value: 'Eraser'}, cashier: {value: 'Kim'} } ]; var result = record.map(r => { var item = {}; for(let key of dataholder) item[key] = r[key].value; return item; }); console.log(result);

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

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