首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:根据对象属性将2个对象数组合并为一个新的数组

Javascript:根据对象属性将2个对象数组合并为一个新的数组
EN

Stack Overflow用户
提问于 2022-03-31 09:01:23
回答 3查看 208关注 0票数 0

我在javascript中有两个JSON对象数组,我想从其中创建一个新数组,在属性"Word_No“上映射它们,它们如下所示:

wordInfo (长度4000):

代码语言:javascript
复制
    [
    {
        "Word_No": "0",
        "Alarm_Bit": "0",
        "Alarm_No": "1",
        "Alarm_Description": "Alarm text 1"
    },
    {
        "Word_No": "0",
        "Alarm_Bit": "1",
        "Alarm_No": "2",
        "Alarm_Description": "Alarm text 2"
    },
    {
        "Word_No": "0",
        "Alarm_Bit": "2",
        "Alarm_No": "3",
        "Alarm_Description": "Alarm text 3"
    }
]

和wordTags (长度250):

代码语言:javascript
复制
    [
    {
        "Word_No": "0",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15"
    },
    {
        "Word_No": "1",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm16_31"
    },
    {
        "Word_No": "2",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm32_47"
    }
]

我需要成为一个新的数组: Alarmlist (长度4000):

代码语言:javascript
复制
    [
    {
        "OPC Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15",
        "Alarm_Bit": "0",
        "Alarm_No": "1",
        "Alarm_Description": "Alarm text 1"
    },
    {
        "OPC Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15",
        "Alarm_Bit": "1",
        "Alarm_No": "2",
        "Alarm_Description": "Alarm text 2"
    },
    {
        "OPC Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15",
        "Alarm_Bit": "2",
        "Alarm_No": "3",
        "Alarm_Description": "Alarm text 3"
    }
]

当我尝试使用2 for循环和Word_No属性上的映射构建这个函数时,它会崩溃。

代码语言:javascript
复制
    for (i = 0; i < wordInfo.length; ++i){  //Outer loop  
    for (j = 0; j < wordTags.length; ++j){  //Inner loop
        msg.Info_Word_No = wordInfo[i].Word_No //Woordnr
        msg.Tag_Word_No = wordTags[j].Word_No //Woordnr
        node.send(msg);
    } 
}

当我将i和j限制在例如10时,函数将执行并在调试窗口中显示单词号。

我的想法是绘制这样的地图:

代码语言:javascript
复制
if(wordInfo[i].Word_No == wordTags[i].Word_No){
            var alarmTagInfo;
            alarmTagInfo.Alarm_No=wordInfo[i].Alarm_No;
            alarmTagInfo.OPC_Tag = wordTags[i].OPC_Tag;
            alarmTagInfo.Alarm_Bit = wordInfo[i].Alarm_Bit;
            msg.payload = alarmTagInfo;
            alarmlist.push(alarmTagInfo);
        }

但是由于数组太大,Node应用程序就会崩溃。我不知道怎样才能有效地处理这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-31 09:08:29

我建议首先使用OPC_Tag上的Array.reduce()为wordTags创建一个查找对象--这将提高性能,避免为wordInfo上的循环的每一次迭代执行.find()。

然后,我们将使用Array.map() on wordInfo来创建最终结果:

代码语言:javascript
复制
let wordInfo = [ { "Word_No": "0", "Alarm_Bit": "0", "Alarm_No": "1", "Alarm_Description": "Alarm text 1" }, { "Word_No": "0", "Alarm_Bit": "1", "Alarm_No": "2", "Alarm_Description": "Alarm text 2" }, { "Word_No": "0", "Alarm_Bit": "2", "Alarm_No": "3", "Alarm_Description": "Alarm text 3" } ]
let wordTags = [ { "Word_No": "0", "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15" }, { "Word_No": "1", "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm16_31" }, { "Word_No": "2", "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm32_47" } ] 

// Create a lookup, mapping Word_No to OPC_Tag
let wordTagsLookup = wordTags.reduce((acc, { Word_No, OPC_Tag }) => { 
    acc[Word_No] = OPC_Tag;
    return acc;
}, {})

let result = wordInfo.map(({ Word_No, Alarm_Bit, Alarm_No, Alarm_Description}) => { 
    return { Alarm_Bit, Alarm_No, Alarm_Description, OPC_Tag: wordTagsLookup[Word_No] };
})

console.log('Result:', result)
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; }

票数 2
EN

Stack Overflow用户

发布于 2022-03-31 09:09:20

我建议为第二个数组创建一个Map,该数组由Word_No键决定。然后将该数组映射到使用该Map进行转换的对象。随着对象的破坏,这可能会变得非常优雅:

代码语言:javascript
复制
// Sample input data
const wordInfo = [{"Word_No": "0","Alarm_Bit": "0","Alarm_No": "1","Alarm_Description": "Alarm text 1"},{"Word_No": "0","Alarm_Bit": "1","Alarm_No": "2","Alarm_Description": "Alarm text 2"},{"Word_No": "0","Alarm_Bit": "2","Alarm_No": "3","Alarm_Description": "Alarm text 3"}];
const wordTags = [{"Word_No": "0","OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15"},{"Word_No": "1","OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm16_31"},{"Word_No": "2","OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm32_47"}];

// Create map keyed by Word_No:
const map = new Map(wordTags.map(({Word_No, OPC_Tag}) => ([Word_No, OPC_Tag])));
// Translate the source data to the target data
const alarmList = wordInfo .map(({Word_No, ...rest}) => 
    ({OPC_Tag: map.get(Word_No), ...rest})
); 
console.log(alarmList);

票数 1
EN

Stack Overflow用户

发布于 2022-03-31 09:33:08

对我来说,您可以这样做,只需使用.map()和.filter()方法:

代码语言:javascript
复制
const wordInfo = [
  {
      "Word_No": "0",
      "Alarm_Bit": "0",
      "Alarm_No": "1",
      "Alarm_Description": "Alarm text 1"
  },
  {
      "Word_No": "0",
      "Alarm_Bit": "1",
      "Alarm_No": "2",
      "Alarm_Description": "Alarm text 2"
  },
  {
      "Word_No": "0",
      "Alarm_Bit": "2",
      "Alarm_No": "3",
      "Alarm_Description": "Alarm text 3"
  },
];

const wordTags = [
    {
        "Word_No": "0",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm0_15"
    },
    {
        "Word_No": "1",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm16_31"
    },
    {
        "Word_No": "2",
        "OPC_Tag": "HH.Application.TmpHmi_Var.TmpHmiC7.Alarm32_47"
    }
];

const data = wordInfo.map((wordInfoItem) => {
  const wordTag = wordTags
    .filter((wordTagItem) => (wordInfoItem["Word_No"] === wordTagItem["Word_No"]))[0];
  
  const newArray = {
    ...wordTag,
    ...wordInfoItem,
  };

  delete newArray['Word_No'];
  return newArray;
});

console.log(data);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71689706

复制
相关文章

相似问题

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