为了账号安全,请及时绑定邮箱和手机立即绑定

映射两个数组以查看一个属性是否匹配,然后将特定信息推送到第一个数组中

映射两个数组以查看一个属性是否匹配,然后将特定信息推送到第一个数组中

慕容3067478 2021-11-18 16:26:42
javascript 新手,正在努力学习!我试图映射两个对象数组,如果某个属性匹配,则将特定信息拉入第一个数组。let result;let arrNames = [{  id: 10    name: "A"}, {  id: 11,  name: "B"}, {  id: 12,  name: "C"}, }, {  id: 13,  name: "A"}, {  id: 14,  name: "B"}]let arrInfo = [{  name: "A",  info: "AAA"}, {  name: "B",  info: "BBB"}, {  name: "C",  info: "CCC"}]如果 arrNames.name == arrInfo.name,我想将信息推送到名称数组中。想要的结果:let arrNames = [{  id: 10    name: "A",  info: "AAA"}, {  id: 11,  name: "B",  info: "BBB"}, {  id: 12,  name: "C",  info: "CCC"}, }, {  id: 13,  name: "A",  info: "AAA"}, {  id: 14,  name: "B",  info: "BBB"}]我试过的:const res = arrInfo.map((el, index) => {      if(el.name == arrNames[index].name)         arrNames.push(el.info)    }^ 这显然行不通——但我想知道在这里扩展或推送是否合适。在此先感谢您的帮助(抱歉这可能是个骗局)。
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

转换arrInfo为Map,以name为键。现在映射 arrNames并添加您从arrInfoMap使用name. 使用对象展开来组合两个对象:


const arrNames = [{"id":10,"name":"A"},{"id":11,"name":"B"},{"id":12,"name":"C"},{"id":13,"name":"A"},{"id":14,"name":"B"}]


const arrInfo = [{"name":"A","info":"AAA"},{"name":"B","info":"BBB"},{"name":"C","info":"CCC"}]


const arrInfoMap = new Map(arrInfo.map(o => [o.name, o]))


const result = arrNames.map(o => ({ ...o, ...arrInfoMap.get(o.name) }))


console.log(result)


查看完整回答
反对 回复 2021-11-18
?
慕斯709654

TA贡献1840条经验 获得超5个赞

你可以这样做:


let arrNames = [

  {

    id: 10,

    name: 'A'

  },

  {

    id: 11,

    name: 'B'

  },

  {

    id: 12,

    name: 'C'

  },

  {

    id: 13,

    name: 'A'

  },

  {

    id: 14,

    name: 'B'

  }

];


let arrInfo = [

  {

    name: 'A',

    info: 'AAA'

  },

  {

    name: 'B',

    info: 'BBB'

  },

  {

    name: 'C',

    info: 'CCC'

  }

];


// do this

const result = arrNames.map((item) => {

  const newItem = item; // here we define a new object that is the same as your object that is currently looped up to in your arrNames array


  // loop your second array over this currently looped to object, seeing if the name matches

  arrInfo.forEach((item2) => {

    if (item.name === item2.name) {

      newItem.info = item2.info; // if they do set a new property for your new object called info as the info from item 2 of this arrInfo array

    }

  });


  // return this new object whether or not there was a match for the name property

  return newItem; 

});


console.log(result);


所以你的 map 方法的问题是你需要记住在你的回调函数结束时返回一些东西。您只是推送到一个数组,就像使用.mapas a 一样forEach。Map 将一个数组转换为另一个相同长度的数组。在这里,您正在尝试创建一个新数组,其中被循环的数组元素将有一个额外的info属性,如果它与您的第二个数组arrInfo的名称相匹配。


因此,您可以做的是在地图中使用 forEach 来检查它们是否匹配,如果匹配,则向您的 arrayNames 元素添加一个新属性,并将其作为新创建的数组的新元素返回。希望有所帮助,如果您需要,请在评论中要求澄清。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信