首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点js从对象数组创建特定模式的对象。

节点js从对象数组创建特定模式的对象。
EN

Stack Overflow用户
提问于 2018-06-01 09:23:11
回答 4查看 75关注 0票数 2

在从对象数组创建对象时,我在for循环中遇到了一些问题,我在节点js应用程序中有一个数组:

代码语言:javascript
复制
[
        {
            "Material": "113/133",
            "Name": [
                {
                    "name": "WELD1",
                    "value": 27520
                },
                {
                    "name": "WELD2",
                    "value": 676992
                },
                {
                    "name": "WELD3",
                    "value": 421
                }
            ]
        },
        {
            "Material": "150/300",
            "Name": [
                {
                    "name": "WELD1",
                    "value": 1441
                },
                {
                    "name": "WELD2",
                    "value": 555
                },
                {
                    "name": "WELD3",
                    "value": 100992
                }
            ]
        }
    ]

我想返回这样的对象,它包含了数组、名称和对象数组中的值,如下所示:

代码语言:javascript
复制
{
    Material: ["113/133", "150/300"],
    datasets: [
        {
            label: "WELD1",
            data: [27520,1441]
        },
        {
            label: "WELD2",
            data: [676992,555]
        },
                {
            label: "WELD3",
            data: [100,20,0]
        }
    ]
}

我想得到使用for循环的结果。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-01 09:53:16

代码语言:javascript
复制
let array = [
        {
            "Material": "113/133",
            "Name": [
                {
                    "name": "WELD1",
                    "value": 27520
                },
                {
                    "name": "WELD2",
                    "value": 676992
                },
                {
                    "name": "WELD3",
                    "value": 421
                }
            ]
        },
        {
            "Material": "150/300",
            "Name": [
                {
                    "name": "WELD1",
                    "value": 1441
                },
                {
                    "name": "WELD2",
                    "value": 555
                },
                {
                    "name": "WELD3",
                    "value": 100992
                }
            ]
        }
    ]

let answer = {Material: [], datasets: []}

array.forEach(x => {
  answer.Material.push(x.Material);
  
  x.Name.forEach(na => {
    let object = answer.datasets.find(obj => obj.label === na.name) || {label: "", data: []};
    
    if(object.label === ""){
    	object.label = na.name;
      object.data.push(na.value);
      answer.datasets.push(object);
    }else{
    	object.data.push(na.value)
    }
  });
  
  
});

console.log(answer);

以上是使用forEach而不是reduce的替代解决方案。

票数 1
EN

Stack Overflow用户

发布于 2018-06-01 09:44:29

您可以使用.reduce()并执行如下操作:

代码语言:javascript
复制
var arr = [
    {
        "Material": "113/133",
        "Name": [
            {
                "name": "WELD1",
                "value": 27520
            },
            {
                "name": "WELD2",
                "value": 676992
            },
            {
                "name": "WELD3",
                "value": 421
            }
        ]
    },
    {
        "Material": "150/300",
        "Name": [
            {
                "name": "WELD1",
                "value": 1441
            },
            {
                "name": "WELD2",
                "value": 555
            },
            {
                "name": "WELD3",
                "value": 100992
            }
        ]
    }
];

var newArr = arr.reduce((acc, ob) => {
  for (var key in ob)
     if(typeof acc[key] === 'object')
         acc[key] = acc[key] ? acc[key].concat(ob[key]) : [ob[key]];
     else
         acc[key] ? acc[key].push(ob[key]) : acc[key] = [ob[key]];
  return acc;
}, {}); 

console.log(newArr);

票数 2
EN

Stack Overflow用户

发布于 2018-06-01 09:44:38

使用Array.reduce构建新的数据结构

代码语言:javascript
复制
const start = [{
    "Material": "113/133",
    "Name": [{
        "name": "WELD1",
        "value": 27520
      },
      {
        "name": "WELD2",
        "value": 676992
      },
      {
        "name": "WELD3",
        "value": 421
      }
    ]
  },
  {
    "Material": "150/300",
    "Name": [{
        "name": "WELD1",
        "value": 1441
      },
      {
        "name": "WELD2",
        "value": 555
      },
      {
        "name": "WELD3",
        "value": 100992
      }
    ]
  }
];

const end = start.reduce((tmp, {
  Material,
  Name,
}) => {
  // Handle the material
  // If it do not exist in the array, push it
  if (!tmp.Material.includes(Material)) {
    tmp.Material.push(Material);
  }

  // Handle the datasets
  // Look at each Name
  Name.forEach(({
    name,
    value,
  }) => {
    // Can we find the label?
    const labelFind = tmp.datasets.find(y => y.label === name);

    // If we can't find the label, create a new dataset
    if (!labelFind) {
      tmp.datasets.push({
        label: name,

        data: [
          value,
        ],
      });

      return;
    }

    // If we has found it push new value in the dataset 
    labelFind.data.push(value);
  });

  return tmp;
}, {
  Material: [],
  datasets: [],
});

console.log(end);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50640152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档