Javascript 数组是外部对象中某个属性的属性的数组的总和

Javascript 数组是外部对象中某个属性的属性的数组的总和,javascript,node.js,json,lodash,Javascript,Node.js,Json,Lodash,我有一个对象,在这种情况下,它代表一个博客中的用户,在这个博客中,我试图合并一个作者,他们的总喜好已经合并,例如: { 'Edsger W. Dijkstra': [ // o { author: 'Edsger W. Dijkstra', likes: 5 }, { author: 'Edsger W. Dijkstra', likes: 10 } ], 'Benizio Mauritez': [ { author: 'Benizio

我有一个对象,在这种情况下,它代表一个博客中的用户,在这个博客中,我试图合并一个作者,他们的总喜好已经合并,例如:

{
    'Edsger W. Dijkstra': [ // o
      { author: 'Edsger W. Dijkstra', likes: 5 },
      { author: 'Edsger W. Dijkstra', likes: 10 }
    ],
    'Benizio Mauritez': [
      { author: 'Benizio Mauritez', likes: 12 },
      { author: 'Benizio Mauritez', likes: 8 }
    ]
  }
我该怎么做?我已经尝试过减少他们的道具了,在重新分配或创建新道具时遇到了麻烦,尝试了lodash的sumBy功能,所以如果有人能告诉我如何做,我将非常感激!,非常感谢
!

您可以在“输入”对象中遍历作者,并生成一个“输出”对象,在其中对相关数组的“喜欢”进行求和

大概是这样的:

输入={ “Edsger W.Dijkstra”://o {作者:'Edsger W.Dijkstra',喜欢:5}, {作者:'Edsger W.Dijkstra',喜欢:10} ], “Benizio Mauritez”:[ {作者:'Benizio Mauritez',喜欢:12}, {作者:'Benizio Mauritez',喜欢:8} ] }; output=Object.keysinput.mapkey=>{ 返回{author:key,likes:input[key].reducea,b=>a+b['likes',0}; } console.logoutput; 再解释一下:

Object.keysinput将为您提供“输入”对象中的作者数组

console.logObject.keysinput; //[Edsger W.Dijkstra,Benizio Mauritez] 然后,您可以使用该函数创建一个新数组,其中填充了对调用数组中的每个元素调用所提供函数的结果

output=Object.keysinput.mapkey=>{ console.loginput[key]; } /* [{ 作者:Edsger W.Dijkstra, 喜欢:5 }, { 作者:Edsger W.Dijkstra, 喜欢:10 }] [{ 作者:Benizio Mauritez, 喜欢:12 }, { 作者:Benizio Mauritez, 喜欢:8 }] */
最后,在每个键引用的数组的内部数组上使用该方法对“likes”进行求和。

您可以在“input”对象中遍历作者,并生成一个“output”对象,在其中对相关数组的“likes”进行求和

大概是这样的:

输入={ “Edsger W.Dijkstra”://o {作者:'Edsger W.Dijkstra',喜欢:5}, {作者:'Edsger W.Dijkstra',喜欢:10} ], “Benizio Mauritez”:[ {作者:'Benizio Mauritez',喜欢:12}, {作者:'Benizio Mauritez',喜欢:8} ] }; output=Object.keysinput.mapkey=>{ 返回{author:key,likes:input[key].reducea,b=>a+b['likes',0}; } console.logoutput; 再解释一下:

Object.keysinput将为您提供“输入”对象中的作者数组

console.logObject.keysinput; //[Edsger W.Dijkstra,Benizio Mauritez] 然后,您可以使用该函数创建一个新数组,其中填充了对调用数组中的每个元素调用所提供函数的结果

output=Object.keysinput.mapkey=>{ console.loginput[key]; } /* [{ 作者:Edsger W.Dijkstra, 喜欢:5 }, { 作者:Edsger W.Dijkstra, 喜欢:10 }] [{ 作者:Benizio Mauritez, 喜欢:12 }, { 作者:Benizio Mauritez, 喜欢:8 }] */
最后,使用内部数组上的方法(每个键的引用数组)对“likes”求和。

如果需要lodash,这里有一个快速的lodash解决方案。您将获得一个对象数组

{
    [
        author: Edsger W. Dijkstra,
        likes: 15
    ],
    [
        author: Benizio Mauritez, 
        likes: 20
    ],
}
结果将是一个对象数组,正如我根据您的示例假设的那样,但是您的示例有语法错误,但是我相信,基于此,您将能够以您需要的格式转换结果,如果没有,请告诉我们=

const data = {
    'Edsger W. Dijkstra': [
        { author: 'Edsger W. Dijkstra', likes: 5 },
        { author: 'Edsger W. Dijkstra', likes: 10 }
    ],
    'Benizio Mauritez': [
        { author: 'Benizio Mauritez', likes: 12 },
        { author: 'Benizio Mauritez', likes: 8 }
    ]
}

const result = []

for (const key in data) {
    if (data.hasOwnProperty(key)) {
        const element = data[key];
        const groupedElements= lodash(element).groupBy('author')
        const resultOfReduction = groupedElements.map((objs, key) => ({
            author: key,
            likes: lodash.sumBy(objs, 'likes')
        })).value();

        result.push(resultOfReduction[0])
    }
}

console.log(result);

如果您需要lodash,这里有一个快速的lodash解决方案。您将获得一个对象数组

{
    [
        author: Edsger W. Dijkstra,
        likes: 15
    ],
    [
        author: Benizio Mauritez, 
        likes: 20
    ],
}
结果将是一个对象数组,正如我根据您的示例假设的那样,但是您的示例有语法错误,但是我相信,基于此,您将能够以您需要的格式转换结果,如果没有,请告诉我们=

const data = {
    'Edsger W. Dijkstra': [
        { author: 'Edsger W. Dijkstra', likes: 5 },
        { author: 'Edsger W. Dijkstra', likes: 10 }
    ],
    'Benizio Mauritez': [
        { author: 'Benizio Mauritez', likes: 12 },
        { author: 'Benizio Mauritez', likes: 8 }
    ]
}

const result = []

for (const key in data) {
    if (data.hasOwnProperty(key)) {
        const element = data[key];
        const groupedElements= lodash(element).groupBy('author')
        const resultOfReduction = groupedElements.map((objs, key) => ({
            author: key,
            likes: lodash.sumBy(objs, 'likes')
        })).value();

        result.push(resultOfReduction[0])
    }
}

console.log(result);

我发现您的初始结构有些奇怪,因为您已经将作者拉到上面的对象中,并将作者的博客文章元数据对象排序到这些列表中。除非我误解了,否则在外部对象中的author键下可能存在错误的author的blog post元数据对象

无论如何,您应该能够通过一个循环和一个map/reduce来解决这个问题

常量postMetadata={ Edsger W.Dijkstra:[ { 作者:Edsger W.Dijkstra, 喜欢:5 }, { 作者:Edsger W.Dijkstra, 喜欢:10 } ], 贝尼齐奥·毛里塔尼亚:[ { 作者:Benizio Mauritez, 喜欢:12 }, { 作者:Benizio Mauritez, 喜欢:8 } ] }; //结果将是从作者到总喜欢的映射,这有点像您描述的结构。 const result={}; 对于postMetadata中的let author{ 让summedLikes=postMetadata[作者] .MapPosteTa=>PosteTa.likes .reducesum,curr=>sum+curr; //在这里用summedLikes做点什么 //比如说 结果[作者]=总结喜欢; } 那又怎么样
我在这里做的是获取你的初始结构,我循环遍历每个作者,然后对于每个作者的博客文章元数据对象,我只需要获取他们喜欢的值的数组,然后我使用求和函数来获得每个博客文章元数据对象的总数。

我发现你的初始结构有点奇怪,假设您已将作者拉入上述对象,并将作者的博客文章元数据对象排序到这些列表中。除非我误解了,否则在外部对象中的author键下可能存在错误的author的blog post元数据对象

无论如何,您应该能够通过一个循环和一个map/reduce来解决这个问题

常量postMetadata={ Edsger W.Dijkstra:[ { 作者:Edsger W.Dijkstra, 喜欢:5 }, { 作者:Edsger W.Dijkstra, 喜欢:10 } ], 贝尼齐奥·毛里塔尼亚:[ { 作者:Benizio Mauritez, 喜欢:12 }, { 作者:Benizio Mauritez, 喜欢:8 } ] }; //结果将是从作者到总喜欢的映射,这有点像您描述的结构。 const result={}; 对于postMetadata中的let author{ 让summedLikes=postMetadata[作者] .MapPosteTa=>PosteTa.likes .reducesum,curr=>sum+curr; //在这里用summedLikes做点什么 //比如说 结果[作者]=总结喜欢; }
所以我在这里做的是采用初始结构,循环遍历每个作者,然后对于每个作者的blog post元数据对象,我使用它们的相似值数组,然后我使用求和函数来获得每个博客文章元数据对象的总数。

我得到了一个答案,这就是它的样子

[
  { author: 'Edsger W. Dijkstra', likes: 15 },
  { author: 'Benizio Mauritez', likes: 20 }
]
我在代码段中提供了解释,希望能有所帮助。 基本上,我使用了Object.keys,它允许您使用数组高阶函数,如*map、reduce、filter…等*,然后使用reduce为每个用户添加like,最后返回包含所需数据的对象

希望这能有所帮助

链接了解更多关于 Object.keys:

Array.prototype.reduce:

Array.prototype.map:

设obj={ “Edsger W.Dijkstra”:[ {作者:'Edsger W.Dijkstra',喜欢:5}, {作者:'Edsger W.Dijkstra',喜欢:10} ], “Benizio Mauritez”:[ {作者:'Benizio Mauritez',喜欢:12}, {作者:'Benizio Mauritez',喜欢:8} ] } /* 1使用Object.keys有助于遍历对象中的所有关键点 2然后,由于可用键的值也是数组,因此我们可以使用reduce添加类似的值 注意:如果您不知道reduce,请阅读关于MDN的文章https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce 3当map返回一个新数组时,ans变量将保存一个包含返回对象的数组 */ 设ans=Object.keysobj.mapitem=>{ 让count=obj[item].reduceacc,current=>acc+current.likes,0; 返回{'author':项,'likes':计数} };
console.logans我得到了一个答案这就是它的样子

[
  { author: 'Edsger W. Dijkstra', likes: 15 },
  { author: 'Benizio Mauritez', likes: 20 }
]
我在代码段中提供了解释,希望能有所帮助。 基本上,我使用了Object.keys,它允许您使用数组高阶函数,如*map、reduce、filter…等*,然后使用reduce为每个用户添加like,最后返回包含所需数据的对象

希望这能有所帮助

链接了解更多关于 Object.keys:

Array.prototype.reduce:

Array.prototype.map:

设obj={ “Edsger W.Dijkstra”:[ {作者:'Edsger W.Dijkstra',喜欢:5}, {作者:'Edsger W.Dijkstra',喜欢:10} ], “Benizio Mauritez”:[ {作者:'Benizio Mauritez',喜欢:12}, {作者:'Benizio Mauritez',喜欢:8} ] } /* 1使用Object.keys有助于遍历对象中的所有关键点 2然后,由于可用键的值也是数组,因此我们可以使用reduce添加类似的值 注意:如果您不知道reduce,请阅读关于MDN的文章https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce 3当map返回一个新数组时,ans变量将保存一个包含返回对象的数组 */ 设ans=Object.keysobj.mapitem=>{ 让count=obj[item].reduceacc,current=>acc+current.likes,0; 返回{'author':项,'likes':计数} }; console.logans使用u.map迭代对象,使用键2nd参数作为作者。通过使用u.sumBy获得喜欢的总和来获得喜欢:

const obj={Edsger W.Dijkstra:[{作者:Edsger W.Dijkstra,likes:5},{作者:Edsger W.Dijkstra,likes:10}],Benizio Mauritez:[{作者:Benizio Mauritez,likes:12},{作者:Benizio Mauritez,likes:8}] const result=u.mapobj,v,author=>{ 著者 喜欢:uu.sumByv,“喜欢” } console.logresult 使用u.map迭代对象,使用键2nd参数作为作者。通过使用u.sumBy获得喜欢的总和来获得喜欢:

const obj={Edsger W.Dijkstra:[{作者:Edsger W.Dijkstra,likes:5},{作者:Edsger W.Dijkstra,likes:10}],Benizio Mauritez:[{作者:Benizio Mauritez,likes:12},{作者:Benizio Mauritez,likes:8}] const result=u.mapobj,v,author=>{ 著者 喜欢:uu.sumByv,“喜欢” } console.logresult
它是什么意思[喜欢:15]?I假设syntaxYup不正确,我已经更正了预期答案,出于某种原因,它发布了格式错误的预期对象记录是唯一的吗?是的,它们是唯一的,外部属性负责显示用户的所有帖子,因此如果有5篇帖子,例如djikstra,它们将被包含在同名的道具上。它是什么意思[likes:15]?I假设syntaxYup不正确,我已经更正了预期答案,出于某种原因,它发布了格式错误的预期对象记录是唯一的吗?是的,它们是唯一的,外部属性负责显示用户的所有帖子,因此如果有5篇帖子,例如djikstra,它们将被包含在同名道具上。删除['likes']并像符咒一样工作,你们是救生员,非常感谢。删除['likes']并像符咒一样工作,你们是救生员,非常感谢。非常感谢lodash的回答,我目前正在学习如何使用它。这个输入实际上是groupBy lodash函数的返回值,但对我来说效果不太好,谢谢!非常感谢lodash的回答,我目前正在学习如何使用它。此输入实际上是groupBy lodash函数的返回值,但对我来说效果不太好,谢谢!我很感激你的解释,它确实很有道理,而且它也让我头脑发热,就像其他人一样,非常感谢你花时间回答我的问题,我为奇怪的格式表示歉意,不知何故,这不是我所期望的格式,但你无论如何都明白了,谢谢!我很感激你的解释,它确实很有道理,而且它也让我头脑发热,就像其他人一样,非常感谢你花时间回答我的问题,我为奇怪的格式表示歉意,不知何故,这不是我所期望的格式,但你无论如何都明白了,谢谢!Clean solution,我刚刚看了这篇文章,非常感谢你对我的解释,我确实知道reduce函数和高阶函数,但是作为属性遍历数组的想法让我头脑发热,所以你的解释让我头脑清醒,非常感谢你花时间向我解释你的过程,将使用它,欢迎您@maurirlz。我很高兴能在某种程度上帮助您。Clean solution,我刚刚看了这篇文章,非常感谢您对我的解释,我确实知道reduce和更高阶函数,但作为属性遍历数组的想法让我头脑发热,所以您的解释让我头脑清醒,非常感谢您花时间向我解释您的程序,我们将使用Retaining It You is welcome@maurirlz。我很高兴我能在某种程度上帮助你。