【问题标题】:How to combine two array of objects of different sizes, based on a property in Javascript?如何根据Javascript中的属性组合两个不同大小的对象数组?
【发布时间】:2018-07-12 07:39:55
【问题描述】:

我有两个长度不同但共享相似信息的对象数组。

qrySearchLocID = [{
    LocalLabID: '123f',
    SystemID: 5000152,
    AppLabID: 3
  },
  {
    LocalLabID: '12BC',
    SystemID: 5000384,
    AppLabID: 3
  },
];

qrySearch = [{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384
  },
]

我想根据 SystemID 组合这两个数组,从 qrySearch 复制所有信息并从 qrySearchLocID 添加 LocalLabID,仅此而已。例如我希望结果数组是

[{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152,
    LocalLabID: '123f'
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384,
    LocalLabID: '12BC'
  },
]

提前致谢。

【问题讨论】:

  • 为什么'SomePlace2' 在你想要的输出中有SystemID: 5000152?是错字吧?
  • @Ele 我的错

标签: javascript arrays object javascript-objects


【解决方案1】:

您可以使用mapfind 函数。

var qrySearchLocID = [{
    LocalLabID: '123f',
    SystemID: 5000152,
    AppLabID: 3
  },
  {
    LocalLabID: '12BC',
    SystemID: 5000384,
    AppLabID: 3
  },
];

var qrySearch = [{
    sName: 'SomePlace1',
    lBusinessID: 37343,
    SystemID: 5000152
  },
  {
    sName: 'SomePlace2',
    lBusinessID: 39780,
    SystemID: 5000156
  },
  {
    sName: 'SomePlace3',
    lBusinessID: 50772,
    SystemID: 5000519
  },
  {
    sName: 'SomePlace4',
    lBusinessID: 31079,
    SystemID: 5000384
  },
];

var result = qrySearch.map((e, _) => 
          (_ = qrySearchLocID.find((q) => q.SystemID === e.SystemID)) ? 
          { ...e, ...{ LocalLabID: _.LocalLabID } } : e);

console.log(result);

资源

【讨论】:

    【解决方案2】:

    我的建议是将两者都转换为由 SystemID 键入的对象文字的中间形式。然后您可以将所有属性添加到该对象,然后再转换回您长期需要的任何形式。

    【讨论】:

      【解决方案3】:

      您可以使用Array.findIndex函数在数组中查找满足一定条件的索引,然后将信息添加到该索引处的对象中:

      qrySearchLocID = [{
          LocalLabID: '123f',
          SystemID: 5000152,
          AppLabID: 3
        },
        {
          LocalLabID: '12BC',
          SystemID: 5000384,
          AppLabID: 3
        },
      ];
      qrySearch = [{
          sName: 'SomePlace1',
          lBusinessID: 37343,
          SystemID: 5000152
        },
        {
          sName: 'SomePlace2',
          lBusinessID: 39780,
          SystemID: 5000156
        },
        {
          sName: 'SomePlace3',
          lBusinessID: 50772,
          SystemID: 5000519
        },
        {
          sName: 'SomePlace4',
          lBusinessID: 31079,
          SystemID: 5000384
        },
      ]
      
      for(var i = 0; i < qrySearch.length; i++){
        var j = qrySearchLocID.findIndex(function(elem){
          return elem.SystemID == qrySearch[i].SystemID;
        });
        if(j != -1){
          qrySearch[i].LocalLabID = qrySearchLocID[j].LocalLabID;
        }
      }
      
      console.log(qrySearch)

      【讨论】:

        【解决方案4】:

        为了加快查找速度,您可以先将第一个数组转换为由 SystemID 键入的 Map。然后在第二个数组的map 中使用它,在地图中查找 SystemID 并获取它的 LocalLabID(如果存在)。

        在这里,您可以看到在一个函数表达式中发生的所有事情:

        const qrySearchLocID = [ { LocalLabID: '123f', SystemID: 5000152, AppLabID: 3 },{ LocalLabID: '12BC', SystemID: 5000384, AppLabID: 3 }],
            qrySearch = [{ sName: 'SomePlace1', lBusinessID: 37343, SystemID: 5000152},{ sName: 'SomePlace2', lBusinessID: 39780, SystemID: 5000156 },{ sName: 'SomePlace3', lBusinessID: 50772, SystemID: 5000519 },{ sName: 'SomePlace4', lBusinessID: 31079, SystemID: 5000384 }];
            
        const result = qrySearch.map(
            (map => o => Object.assign(o, map.has(o.SystemID) 
                                          && { LocalLabID: map.get(o.SystemID) }))
                (new Map(qrySearchLocID.map(loc => [loc.SystemID, loc.LocalLabID])))
        );
        
        console.log(result);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 1970-01-01
          • 2019-12-26
          相关资源
          最近更新 更多