【问题标题】:compare two arrays based on a id and return a new array based on values根据 id 比较两个数组并根据值返回一个新数组
【发布时间】:2018-03-28 20:19:27
【问题描述】:

尝试遍历两个数组并找到每个数组的代码,我可能会遗漏某些部分。我需要用这个值构造一个新数组,每个id可以在arrayB中多次出现。根据第一个数组中的 id,我们必须匹配第二个数组(arrayA)中的 id 并获取代码

let arrayA=[
    {"breadcrumb":{id: "abdc4051"}, type:"details"},
    {"breadcrumb":{id: "abdc4052"}, type:"details"},

    let arrayB=[
    {"breadcrumb": {id: "abdc4051",code: "mike", length:"short"}},
    {"breadcrumb": {id: "abdc4051", code: "pohan", length:"long"}}, {"breadcrumb": {id: "abdc4052", code: "junior", length:"short"}}]

    let arrayC = [];
    // output expected
[{"id":"abdc4051", shortLength: "mike", longLength:"pohan"}, {"id":"abdc4052", shortLength: "Junior", longLength:"-"}]
    // tried this
    function isBiggerThan10(element, index, array) {
      return element > 10;
    }

    arrayA.forEach(function(element){
      arrayC.push({
      id:element.id,
      firstName:(arrayB.find(
        e => e.attributes.code==="mike")).breadCrumbs.shortLength,
      lastName:(arrayB.find(
        e => e.code==="pohan")).breadCrumbs.longlength
      })
    });

    console.log(arrayC);

【问题讨论】:

  • 我不确定我是否能够正确理解您的问题
  • [{"id":"abdc4051", firstName: "mike", lastName:"pohan"}, {"id":"abdc4052", firstName: "Junior", lastName:"- "}] 这应该是基于 arrayA 和 arrayB 值的输出
  • 我觉得同样的问题一天会被问三十次左右

标签: javascript jquery loops lodash


【解决方案1】:

这是使用内置数组方法的一种解决方案。步骤是:

对于arrayA 中的每个项目,执行以下操作:

  • 查找arrayB 中具有相同ID 的所有项目(使用.filter)。
  • 将所有这些结果合并到一个对象中,如果不存在名字和姓氏,则使用默认的“-”(使用.reduce)。
  • 将其放入结果数组中(首先在 arrayA 上使用 .map 处理)。

let arrayA = [
    {"breadcrumb":{id: "abdc4051"}, type:"details"},
    {"breadcrumb":{id: "abdc4052"}, type:"details"},
]

let arrayB = [
    {"breadcrumb": {id: "abdc4051", firstName: "mike"}},
    {"breadcrumb": {id: "abdc4051", lastName: "pohan"}},
    {"breadcrumb": {id: "abdc4052", firstName: "junior"}},
]

// output expected
// [
//   {"id":"abdc4051", firstName: "mike", lastName:"pohan"},
//   {"id":"abdc4052", firstName: "Junior", lastName:"-"},
// ]

const result = arrayA.map(itemA => {
    return arrayB
        .filter(itemB => itemB.breadcrumb.id === itemA.breadcrumb.id)
        .reduce((combo, item) => ({...combo, ...item.breadcrumb}), {firstName: "-", lastName: "-"})
});

console.log(result);

编辑:根据已编辑的问题,您可以修改 reduce 函数以查看组合是否设置了 firstCode。如果是,则将下一个code 放在键lastCode 下,否则保持为firstCode。这将基于它们在arrayB 中出现的顺序的第一个/最后一个代码:

let arrayA = [
    {"breadcrumb":{id: "abdc4051"}, type:"details"},
    {"breadcrumb":{id: "abdc4052"}, type:"details"},
]

let arrayB = [
    {"breadcrumb": {id: "abdc4051", code: "mike"}},
    {"breadcrumb": {id: "abdc4051", code: "pohan"}},
    {"breadcrumb": {id: "abdc4052", code: "junior"}},
]

// output expected
// [
//   {"id":"abdc4051", firstCode: "mike", lastCode:"pohan"},
//   {"id":"abdc4052", firstCode: "Junior", lastCode:"-"},
// ]

const result = arrayA.map(itemA => {
    return arrayB
        .filter(itemB => itemB.breadcrumb.id === itemA.breadcrumb.id)
        .reduce((combo, item) => ({...combo, [combo.firstCode === "-" ? "firstCode" : "lastCode"]: item.breadcrumb.code, id: itemA.breadcrumb.id}), {firstCode: "-", lastCode: "-"})
});

console.log(result);

编辑2:每秒编辑,您可以再次修改reduce以满足您的需要:

let arrayA = [
    {"breadcrumb":{id: "abdc4051"}, type:"details"},
    {"breadcrumb":{id: "abdc4052"}, type:"details"},
]

let arrayB = [
    {"breadcrumb": {id: "abdc4051", code: "mike", length: "short"}},
    {"breadcrumb": {id: "abdc4051", code: "pohan", length: "long"}},
    {"breadcrumb": {id: "abdc4052", code: "junior", length: "short"}},
]

// output expected
// [
//   {"id":"abdc4051", shortLength: "mike", longLength:"pohan"},
//   {"id":"abdc4052", shortLength: "junior", longLength:"-"},
// ]

const result = arrayA.map(itemA => {
    return arrayB
        .filter(itemB => itemB.breadcrumb.id === itemA.breadcrumb.id)
        .reduce((combo, item) => ({...combo, [item.breadcrumb.length + "Length"]: item.breadcrumb.code, id: itemA.breadcrumb.id}), {shortLength: "-", longLength: "-"})
});

console.log(result);

【讨论】:

  • 如果属性名称相同怎么办:让 arrayA = [ {"breadcrumb":{id:"abdc4051"}, type:"details"}, {"breadcrumb":{id:"abdc4052" }, type:"details"}, ] let arrayB = [ {"breadcrumb": {id: "abdc4051", firstName: "mike"}}, {"breadcrumb": {id: "abdc4051", firstName: "pohan "}}, {"breadcrumb": {id: "abdc4052", firstName: "junior"}}, ] .. 输出应该有 firstname:mike 和 lastName:pohan
  • 修改了问题,很抱歉错过了
  • 您编辑的问题中的预期结果仍然是您想要的吗?第一项有firstCodelastCode,第二项有firstNamelastName。他们不应该两者兼而有之吗?
  • 不,它没有给出我期望的答案。我需要 firstCode 和 lastCode 在同一个输出对象中。像 {id: abdc4051 , firstCode:mike, lasCode:pohan}
【解决方案2】:

arrayB 开始一个链。使用_.map()通过id获取breadcrumb_.groupBy()的内容。使用_.pick()arrayA 的ID 来获取您想要的组。使用 _.transform() 将每个组映射到所需的表单:

const arrayA=[{"breadcrumb":{"id":"abdc4051"},"type":"details"},{"breadcrumb":{"id":"abdc4052"},"type":"details"}];
const arrayB=[{"breadcrumb":{"id":"abdc4051","code":"mike","length":"short"}},{"breadcrumb":{"id":"abdc4051","code":"pohan","length":"long"}},{"breadcrumb":{"id":"abdc4052","code":"junior","length":"short"}}];
    
const result = _(arrayB)
  .map('breadcrumb') // unwrap breadcrumb
  .groupBy('id')
  .pick(arrayA.map((o) => _.get(o, 'breadcrumb.id'))) // get all groups that match arrayA ids
  .map((g, key) => _.transform(g, (acc, v) => { // transform each group to the requested form
    acc[`${v.length}Length`] = v.code;
  }, { key, shortLength: '-', longLength: '-' }))
  .value(); 
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-06-05
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多