Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个具有虚拟对象的对象数组创建对象数组_Javascript_Jquery_Angular_Reactjs - Fatal编程技术网

Javascript 从另一个具有虚拟对象的对象数组创建对象数组

Javascript 从另一个具有虚拟对象的对象数组创建对象数组,javascript,jquery,angular,reactjs,Javascript,Jquery,Angular,Reactjs,我想从另一个对象数组创建一个对象数组来绘制图形 这是我用来在预期对象内放置对象位置的数组 let uniqueSkills = ['Using', 'Analyzing', 'Summarizing', 'Inferring', 'Predicting', 'Activating'] 这是我需要修改的对象 let data = { data0:[ {count: 1, length: 1, skill: "Activating"}, {count:

我想从另一个对象数组创建一个对象数组来绘制图形

这是我用来在预期对象内放置对象位置的数组

let uniqueSkills = ['Using', 'Analyzing', 'Summarizing', 'Inferring', 'Predicting', 'Activating']
这是我需要修改的对象

let data = {
      data0:[
        {count: 1, length: 1, skill: "Activating"},
        {count: 4, length: 1, skill: "Using"},
        {count: 2, length: 1, skill: "Analyzing"}
      ],
      data1: [
        {count: 2, length: 1, skill: "Summarizing"}
      ],
      data2: [
        {count: 1, length: 1, skill: "Predicting"},
        {count: 4, length: 1, skill: "Analyzing"}
      ]
    }
最终的结果对象应该如下所示

data = {
      data0:[
        {count: 4, length: 1, skill: "Using"},
        {count: 2, length: 1, skill: "Analyzing"},
        {skill: "Summarizing"},
        {skill: "Inferring"},
        {skill: "Predicting"},
        {count: 4, length: 1, skill: "Activating"}

      ],
      data1: [
        {skill: "Using"},
        {skill: "Analyzing"},
        {count: 2, length: 1, skill: "Summarizing"},
        {skill: "Inferring"},
        {skill: "Predicting"},
        {skill: "Activating"}
      ],
      data2: [
        {skill: "Using"},
        {count: 4, length: 1, skill: "Analyzing"},
        {skill: "Summarizing"},
        {skill: "Inferring"},
        {count: 1, length: 1, skill: "Predicting"},
        {skill: "Activating"}
      ]
    }
我编写的算法在某些情况下运行良好,但在某些情况下会中断。在这里

Object.keys(data).forEach(key => {      
      for (let i = 0; i < uniqueSkills.length; i++) {       
        if (typeof data[key][i] == 'object') {      
          if (data[key][i].skill !== uniqueSkills[i]) {     
            let index = uniqueSkills.indexOf(data[key][i].skill)
            if (typeof data[key][index] == 'object') {
              let anotherIndex = uniqueSkills.indexOf(data[key][index].skill)
              let elementAtIndex = data[key][index]
              let elementAtAnotherIndex = data[key][anotherIndex]
              data[key][i] = elementAtIndex
              data[key][index] = elementAtAnotherIndex
            }
            else {
              data[key][index] = data[key][i]
              data[key][i] = {skill: uniqueSkills[i]}
            }
          }
        } else {        
          data[key][i] = {skill: uniqueSkills[i]}       
        }       
      }     
    })
Object.keys(数据).forEach(key=>{
对于(设i=0;i
您可以使用
映射
首先像空模板一样创建,对象中只有
skill
属性,然后使用您拥有的实际数据填充该
映射
Object.entries
Object.fromEntries
可用于将普通对象转换为数组,反之亦然

由于
Map
保留插入顺序,因此输出顺序将得到保证

让uniqueSkills=[“使用”、“分析”、“总结”、“推断”、“预测”、“激活”]
让数据={data0:[{count:1,length:1,skill:“激活”},{count:4,length:1,skill:“使用”},{count:2,length:1,skill:“分析”}],data1:[{count:2,length:1,skill:“预测”},{count:4,length:1,skill:“分析”};
让newData=Object.fromEntries(Object.entries(data.map)([k,arr])=>
[k,数组。从(arr.reduce(
(map,o)=>map.set(o.skill,o),
新地图(uniqueSkills.Map(skill=>[skill,{skill}]))
).values())]
));

console.log(newData)对于数据中的每个对象,调用
uniqueSkills
Array.prototype.map
并找到一个对象。如果找到对象,则返回该对象;如果未找到,则返回新对象

并用原点替换数组

让uniqueSkills=[“使用”、“分析”、“总结”、“推断”、“预测”、“激活”]
让数据={data0:[{count:1,length:1,skill:“激活”},{count:4,length:1,skill:“使用”},{count:2,length:1,skill:“分析”}],data1:[{count:2,length:1,skill:“预测”},{count:4,length:1,skill:“分析”};
Object.keys(数据).forEach(key=>{
数据[键]=
uniqueSkills.map(skill=>data[key].find(e=>e.skill===skill)|{skill});
});

控制台日志(数据)ES6的完美使用使它变得如此简单。非常感谢。这是一个很好的解决方案,但我不认为它是完美的,因为它的时间复杂度不是最优的O(n³)。事实上,我编写的算法的时间复杂度很差。非常感谢您提供此解决方案。它很容易理解和阅读。