【问题标题】:How to add data from array of object with array inside to another array of object? javascript如何将内部包含数组的对象数组中的数据添加到另一个对象数组中? javascript
【发布时间】:2021-04-13 10:50:36
【问题描述】:

这是我的代码,我想创建另一个过滤数组,如下例所示,我有 2 个数组并想向其中添加分数信息,我知道这很简单但找不到解决方案

  const wishesData = [
    {
       name: "Peter",
      presents: ["coffee", "holidays"]
    },
    {
       name: "Mario",
      presents: ["coffee", "videogames"]
    },
    {
       name: "Amanda",
      presents: ["computer", "tattoo"]
    }
  ]
  const scoresData= [
    {
      name: "Peter",
      score: 10
    },
    {
      name: "Mario",
      score: 2.3
    },
    {
       name: "Amanda",
      score: 1.1
    }
  ]
  const result = wishesData.map((ele) => {
      return {
               ...ele,
              score:  scoresData.find(s=> s.name === ele.name? s.score: 0)
                  }
  })
           console.log("este es el resultado=>",result)

我想修改数组wishData,将“分数”添加到里面的所有对象,然后看起来像这个例子:

{
  name: "Mario",
  presents: ["coffee", "videogames"],
  score: 2.3
}

【问题讨论】:

    标签: javascript arrays object filter


    【解决方案1】:

    请查看示例及更正和建议。

    • 更正:scoresData.find(s=> s.name === ele.name? s.score: 0) - 这里你没有关闭Array.find 的括号并尝试访问它在find 中的属性。在您的代码中,您将获得scoreData 对象而不是score
    const match = scoresData.find(s=> s.name === ele.name); // -> ? s.score: 0)
    return match ? match.score : 0;
    
    // or simply
    const score = scoresData.find(s=> s.name === ele.name)?.score || 0;
    
    • 建议:需要 O(N^2) 时间。 wishesData 的所有迭代都需要另一个迭代 scoresData。为什么不使用示例中提供的reduce
    const scoreMap = scoresData.reduce((a, c) => ({
        ...a,
        [c.name]: c.score
    }), {})
    
    // you can easy to find score by
    const result = wishesData.map((ele) => {
        return {
            ...ele,
            score: scoreMap[ele.name] || 0,
        }
    })
    

    谢谢

    const wishesData = [{
            name: "Peter",
            presents: ["coffee", "holidays"]
        },
        {
            name: "Mario",
            presents: ["coffee", "videogames"]
        },
        {
            name: "Amanda",
            presents: ["computer", "tattoo"]
        }
    ]
    const scoresData = [{
            name: "Peter",
            score: 10
        },
        {
            name: "Mario",
            score: 2.3
        },
        {
            name: "Amanda",
            score: 1.1
        }
    ]
    const scoreMap = scoresData.reduce((a, c) => ({
        ...a,
        [c.name]: c.score
    }), {})
    const result = wishesData.map((ele) => {
        return {
            ...ele,
            score: scoreMap[ele.name] || 0,
        }
    })
    console.log("este es el resultado=>", result)

    这只是编辑您的原始代码

    const wishesData = [{
            name: "Peter",
            presents: ["coffee", "holidays"]
        },
        {
            name: "Mario",
            presents: ["coffee", "videogames"]
        },
        {
            name: "Amanda",
            presents: ["computer", "tattoo"]
        }
    ]
    const scoresData = [{
            name: "Peter",
            score: 10
        },
        {
            name: "Mario",
            score: 2.3
        },
        {
            name: "Amanda",
            score: 1.1
        }
    ]
    const result = wishesData.map((ele) => {
        return {
            ...ele,
            score: scoresData.find(s => s.name === ele.name)?.score || 0
        }
    })
    console.log("este es el resultado=>", result)

    【讨论】:

    • 很好的解释!
    • 感谢@AnuragSrivastava
    【解决方案2】:
    const wishesWithScores = wishesData.map(wishObject => {
      const descriptor = wishObject.name;
      const { score } = scoresData.find(({ name }) => name === descriptor);
    
      return {
        ...wishObject,
        score
      }
    });
    

    【讨论】:

    • 对它的作用做一个小解释会有所帮助
    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
    【解决方案3】:

    你返回整个对象,只返回分数:

    const wishesData = [{
        name: "Peter",
        presents: ["coffee", "holidays"]
      },
      {
        name: "Mario",
        presents: ["coffee", "videogames"]
      },
      {
        name: "Amanda",
        presents: ["computer", "tattoo"]
      },
      {
        name: "Another",
        presents: ["computer", "tattoo"]
      }
    ]
    const scoresData = [{
        name: "Peter",
        score: 10
      },
      {
        name: "Mario",
        score: 2.3
      },
      {
        name: "Amanda",
        score: 1.1
      }
    ]
    const result = wishesData.map(ele => {
      const match = scoresData.find(s => s.name === ele.name)  
      return { ...ele, score: match ? match.score : 0  }
    })
    console.log("este es el resultado=>", result)

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多