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。我很高兴我能在某种程度上帮助你。