【问题标题】:Adding key value pair (value from an array) to specific objects in an array将键值对(来自数组的值)添加到数组中的特定对象
【发布时间】:2018-08-04 07:10:30
【问题描述】:

我有一个对象数组:

chachters = [{name: "Frodo", race: "hobitt", age: 111}, 
             {name: "Gandalf", race: "human", age: 2019}],
             {name: "Aragorn", race: "elf", age: 40}];

还有一个字符串数组。

swords = ["Sting","Glamdring","Anduril"];

我想为“角色”中的对象添加一个键值对,以便将正确的剑分配给正确的角色。需要将 Swords[0] 中的索引匹配到 charachrers[0] 中的值:

这是我希望角色的样子:

 chachters =[{name:"Frodo", race:"hobitt", age:111,sword:"Sting"}, 
             {name:"Gandalf",race:"human",age:2019,sword:"Glamdring"}],
             {name:"Aragorn",race:"elf",age:40,sword:"Anduril"}];

请帮忙。中土的既定事实取决于它。

【问题讨论】:

  • 很多人已经回答了如何按照您的要求做,所以我不会做同样的事情。但是,与其将剑复制到角色对象中,将其保留为剑对象的单独集合并让剑的当前持有者仅存储剑的索引引用是否有益?剑会改变主人吗?您的方法看起来像是一次性的数据整理,而不是存储 2 个实际具有一对一关系的单独列表的理想方法。
  • 我同意@Raith。如果您按照自己的方式进行操作,那么假设您 chachters 数组包含 100 个对象,swords 也将有 100 个字符串,WITH DUPLICATES (因为从逻辑上讲,你不会拥有 100 种不同类型的剑)。比如:["Sting", Glamdring", "Anduril", "Sting", "Anduril", ... ]

标签: javascript arrays reactjs javascript-objects


【解决方案1】:

您可以使用mapObject.assign

var chachters = [{name: "Frodo", race: "hobitt", age: 111}, 
             {name: "Gandalf", race: "human", age: 2019},
             {name: "Aragorn", race: "elf", age: 40}],
    swords = ["Sting","Glamdring","Anduril"];

var result = chachters.map( (obj, i) => Object.assign({ sword: swords[i] }, obj) );
console.log(result);

【讨论】:

    【解决方案2】:

    您可以将array#mapspread syntax 一起使用。根据索引为角色添加一把剑。

    const chachters = [{name: "Frodo", race: "hobitt", age: 111}, {name: "Gandalf", race: "human", age: 2019},       {name: "Aragorn", race: "elf", age: 40}],
          swords = ["Sting","Glamdring","Anduril"],
          result = chachters.map((o,i) => ({...o, sword: swords[i]}));
    console.log(result);

    【讨论】:

      【解决方案3】:

      使用#array.forEach 并为数组的每个对象添加带有剑数组值的额外键。

      工作sn-p(这样,它会直接在原始数组中进行更改):

      let chachters = [
            {name: "Frodo", race: "hobitt", age: 111}, 
            {name: "Gandalf", race: "human", age: 2019},
            {name: "Aragorn", race: "elf", age: 40}];
      
      let swords = ["Sting","Glamdring","Anduril"];
      
      chachters.forEach((el,i) => {
           el.sword = swords[i];
      })
      
      console.log('chachters = ', chachters);

      如果chachters 是一个状态数组并且您正在更新状态,那么使用这种方式:

      let chachters = [
            {name: "Frodo", race: "hobitt", age: 111}, 
            {name: "Gandalf", race: "human", age: 2019},
            {name: "Aragorn", race: "elf", age: 40}];
      
      let swords = ["Sting","Glamdring","Anduril"];
      
      let newchachters = chachters.map((el,i) => ({...el, sword: swords[i]}))
      
      console.log('chachters = ', chachters);
      console.log('newchachters = ', newchachters);

      【讨论】:

        【解决方案4】:

        您可以创建一个函数来将字符串数组附加到对象数组中;

        例如:

        此函数将用于将字符串数组附加到对象数组中

        function appendObjTo(swords, chachters ) {
                return Object.freeze(swords.concat(chachters ));
            } 
        

        根据您的定义:

          swords = ["Sting","Glamdring","Anduril"];
                const chachters = [{name: "Frodo", race: "hobitt", age: 111}, 
                     {name: "Gandalf", race: "human", age: 2019},
                     {name: "Aragorn", race: "elf", age: 40}];
        
                const newChachters = appendObjTo(swords, chachters);
        

        【讨论】:

          【解决方案5】:

          让我试试。我对 .map() 不太熟悉:P

          var characters = [
              {name: "Frodo", race: "hobitt", age: 111}, 
              {name: "Gandalf", race: "human", age: 2019},
              {name: "Aragorn", race: "elf", age: 40}
          ];
          var swords = ["Sting", "Glamdring", "Anduril"];
          
          var charactersWithSwords = characters.map(function (character, index) {
              character.swords = swords[index];
              return character;
          });
          
          console.log(charactersWithSwords);

          结果:

          > Array [Object { name: "Frodo", race: "hobitt", age: 111, swords: "Sting" }, Object { name: "Gandalf", race: "human", age: 2019, swords: "Glamdring" }, Object { name: "Aragorn", race: "elf", age: 40, swords: "Anduril" }]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-09
            • 2019-07-03
            • 1970-01-01
            • 2022-12-28
            • 1970-01-01
            • 2022-06-10
            • 1970-01-01
            • 2021-06-21
            相关资源
            最近更新 更多