繁体   English   中英

我如何比较两个多维数组并合并为单个数组

[英]how can i compare two multidimensional array and merge into single array

我正在寻找一种基于课程值比较和组合两个多维对象数组的方法。 我可以使用顶层的过滤方法使其工作,但不确定如何确保所有级别与技能都深度合并。 下面是一个例子:

 var array1 = [ { "course": "Javascript and protractor", "description": "this is test course", "levelwithskills": [ { "name": "Beginner", "skills": [ { "duration": 45, "name": "HTML/CSS/JS", "price": 75 }, { "duration": 45, "name": "Data And Flows", "price": 75 }, { "duration": 45, "name": "Functions And Objects", "price": 75 }, { "duration": 45, "name": "Protractor Project", "price": 75 } ] }, { "name": "Improver", "skills": [ { "duration": 45, "name": "Jasmine", "price": 90 }, { "duration": 45, "name": "Protractor Methods", "price": 90 }, { "duration": 45, "name": "Non Angular App Testing", "price": 90 }, { "duration": 45, "name": "Reports", "price": 90 } ] }, { "name": "Intermediate", "skills": [ { "duration": 45, "name": "Crossbrowser Config", "price": 100 }, { "duration": 45, "name": "Data-Driven", "price": 100 }, { "duration": 45, "name": "Gulp-Integration", "price": 100 }, { "duration": 45, "name": "User Stories To Test", "price": 100 } ] } ], "s3key": "javascsipt.png" }, { "course": "Java and BDD", "id": "564e0758-803f-11e9-ba30-01cdbe15a808", "levelwithskills": [ { "name": "Beginner", "skills": [ { "duration": 45, "name": "HTML/CSS/JS", "price": 1 }, { "duration": 45, "name": "Data and flows", "price": 1 }, { "duration": 45, "name": "OOP", "price": 1 }, { "duration": 45, "name": "Libraries", "price": 1 } ] }, { "name": "Improver", "skills": [ { "duration": 45, "name": "Selenium Webdriver", "price": 90 }, { "duration": 45, "name": "Junit", "price": 90 }, { "duration": 45, "name": "Saucelabs", "price": 90 }, { "duration": 45, "name": "User Stories To Test", "price": 90 } ] }, { "name": "Intermediate", "skills": [ { "duration": 45, "name": "Most Used Methods", "price": 100 }, { "duration": 45, "name": "Git", "price": 100 }, { "duration": 45, "name": "Gherkin", "price": 100 }, { "duration": 45, "name": "Cucumber", "price": 100 } ] }, { "name": "Semi-Advance", "skills": [ { "duration": 45, "name": "Maven", "price": 110 }, { "duration": 45, "name": "Cucumber Data-driven", "price": 11000 }, { "duration": 45, "name": "Jenkins", "price": 110 }, { "duration": 45, "name": "Pipeline", "price": 110 } ] }, { "name": "Advance", "skills": [ { "duration": 45, "name": "Page Object Model", "price": 120 }, { "duration": 45, "name": "Advanced Methods", "price": 120 }, { "duration": 45, "name": "Advanced Logic", "price": 120 }, { "duration": 45, "name": "Your Own Framework", "price": 120 } ] }, { "name": "Professional", "skills": [ { "duration": 45, "name": "Serenit Framework p1", "price": 130 }, { "duration": 45, "name": "Serenit Framework p2", "price": 130 }, { "duration": 45, "name": "Serenit Framework p3", "price": 130 }, { "duration": 45, "name": "Serenit Framework p4", "price": 130 } ] } ], "passion": "Tester", "s3key": "java.png", } ]; var array2 = [ { "course": "Javascript and protractor", "levelwithskills": [ { "name": "Beginner", "skills": [ { "name": "HTML/CSS/JS" } ] } ] } , { "course": "Java and BDD", "levelwithskills": [ { "name": "Beginner", "skills": [ { "name": "HTML/CSS/JS" } ] } ] } ]; const sameData = array1.map( obj => array2.map(obj2 => { if (obj.course === obj2.course) { return { ...obj, levelwithskills: obj.levelwithskills.map( xlvl => obj2.levelwithskills.map(ylvl => { if (xlvl.name === ylvl.name) { return { ...xlvl, skills: xlvl.skills.map( xskill => ylvl.skills.map(yskill => { if (xskill.name === yskill.name) { return { ...xskill, selected: true }; } return xskill; })[0] ) }; } return xlvl; })[0] ) }; } })[0] ); console.log(sameData);

我正在寻找类似的东西并将其合并:

[
  {
  "course": "Javascript and protractor",
  "description": "this is test course",
  "levelwithskills": [
    {
      "name": "Beginner",
      "skills": [
        {
          "duration": 45,
          "name": "HTML/CSS/JS",
          "price": 75,
          "selected": true
        },
        {
          "duration": 45,
          "name": "Data And Flows",
          "price": 75
        },
        {
          "duration": 45,
          "name": "Functions And Objects",
          "price": 75
        },
        {
          "duration": 45,
          "name": "Protractor Project",
          "price": 75
        }
      ]
    },
    {
      "name": "Improver",
      "skills": [
        {
          "duration": 45,
          "name": "Jasmine",
          "price": 90
        },
        {
          "duration": 45,
          "name": "Protractor Methods",
          "price": 90
        },
        {
          "duration": 45,
          "name": "Non Angular App Testing",
          "price": 90
        },
        {
          "duration": 45,
          "name": "Reports",
          "price": 90
        }
      ]
    },
    {
      "name": "Intermediate",
      "skills": [
        {
          "duration": 45,
          "name": "Crossbrowser Config",
          "price": 100
        },
        {
          "duration": 45,
          "name": "Data-Driven",
          "price": 100
        },
        {
          "duration": 45,
          "name": "Gulp-Integration",
          "price": 100
        },
        {
          "duration": 45,
          "name": "User Stories To Test",
          "price": 100
        }
      ]
    }
  ],
  "s3key": "javascsipt.png"
},
{
  "course": "Java and BDD",
  "id": "564e0758-803f-11e9-ba30-01cdbe15a808",
  "levelwithskills": [
    {
      "name": "Beginner",
      "skills": [
        {
          "duration": 45,
          "name": "HTML/CSS/JS",
          "price": 1
          "selected": true
        },
        {
          "duration": 45,
          "name": "Data and flows",
          "price": 1
        },
        {
          "duration": 45,
          "name": "OOP",
          "price": 1
        },
        {
          "duration": 45,
          "name": "Libraries",
          "price": 1
        }
      ]
    },
    {
      "name": "Improver",
      "skills": [
        {
          "duration": 45,
          "name": "Selenium Webdriver",
          "price": 90
        },
        {
          "duration": 45,
          "name": "Junit",
          "price": 90
        },
        {
          "duration": 45,
          "name": "Saucelabs",
          "price": 90
        },
        {
          "duration": 45,
          "name": "User Stories To Test",
          "price": 90
        }
      ]
    },
    {
      "name": "Intermediate",
      "skills": [
        {
          "duration": 45,
          "name": "Most Used Methods",
          "price": 100
        },
        {
          "duration": 45,
          "name": "Git",
          "price": 100
        },
        {
          "duration": 45,
          "name": "Gherkin",
          "price": 100
        },
        {
          "duration": 45,
          "name": "Cucumber",
          "price": 100
        }
      ]
    },
    {
      "name": "Semi-Advance",
      "skills": [
        {
          "duration": 45,
          "name": "Maven",
          "price": 110
        },
        {
          "duration": 45,
          "name": "Cucumber Data-driven",
          "price": 11000
        },
        {
          "duration": 45,
          "name": "Jenkins",
          "price": 110
        },
        {
          "duration": 45,
          "name": "Pipeline",
          "price": 110
        }
      ]
    },
    {
      "name": "Advance",
      "skills": [
        {
          "duration": 45,
          "name": "Page Object Model",
          "price": 120
        },
        {
          "duration": 45,
          "name": "Advanced Methods",
          "price": 120
        },
        {
          "duration": 45,
          "name": "Advanced Logic",
          "price": 120
        },
        {
          "duration": 45,
          "name": "Your Own Framework",
          "price": 120
        }
      ]
    },
    {
      "name": "Professional",
      "skills": [
        {
          "duration": 45,
          "name": "Serenit Framework p1",
          "price": 130
        },
        {
          "duration": 45,
          "name": "Serenit Framework p2",
          "price": 130
        },
        {
          "duration": 45,
          "name": "Serenit Framework p3",
          "price": 130
        },
        {
          "duration": 45,
          "name": "Serenit Framework p4",
          "price": 130
        }
      ]
    }
  ],
  "passion": "Tester",
  "s3key": "java.png",
}
]

深度合并对象/数组:

取自 drupal - drupal_array_merge_deep_array并用 JS 重写)

function array_merge_deep_array(arrays) {
  let result = [];
  for (let i in arrays){
    for (let key in arrays[i]){
      const value = arrays[i][key];
      // Renumber integer keys
      if (typeof(key) === 'number') {
        result.push(value);
      }
      else if (result[key] && typeof(result[key]) === 'object' && typeof(value) === 'object') {
        result[key] = array_merge_deep_array([
          result[key],
          value,
        ]);
      }
      else {
        result[key] = value;
      }
    }
  }
  return result;
}

暂无
暂无

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

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