使用对象分组数组项

使用对象分组数组项

我的数组是这样的:

myArray = [
  {group: "one", color: "red"},
  {group: "two", color: "blue"},
  {group: "one", color: "green"},
  {group: "one", color: "black"}]

我想把它转换成:

myArray = [
  {group: "one", color: ["red", "green", "black"]}
  {group: "two", color: ["blue"]}]

所以,基本上,按group.

我在努力:

for (i in myArray){
  var group = myArray[i].group;
  //myArray.push(group, {???})}

我只是不知道如何处理类似组值的分组。



萧十郎
浏览 354回答 3
3回答

繁花如伊

首先,在JavaScript中,使用for ... in..看见为什么在数组迭代中使用“for.in”是个坏主意?关于细节。所以你可以试试这样的方法:var&nbsp;groups&nbsp;=&nbsp;{};for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;myArray.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;var&nbsp;groupName&nbsp;=&nbsp;myArray[i].group; &nbsp;&nbsp;if&nbsp;(!groups[groupName])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;groups[groupName]&nbsp;=&nbsp;[]; &nbsp;&nbsp;} &nbsp;&nbsp;groups[groupName].push(myArray[i].color);}myArray&nbsp;=&nbsp;[];for&nbsp;(var&nbsp;groupName&nbsp;in&nbsp;groups)&nbsp;{ &nbsp;&nbsp;myArray.push({group:&nbsp;groupName,&nbsp;color:&nbsp;groups[groupName]});}利用中介groups对象可以帮助加快速度,因为它允许您避免嵌套循环来搜索数组。还有,因为groups是一个对象(而不是数组)使用for ... in是合适的。增编FWIW,如果希望避免在结果数组中重复颜色项,则可以添加if线上语句groups[groupName].push(myArray[i].color);以防重复。使用jQuery,它将如下所示;if&nbsp;(!$.inArray(myArray[i].color,&nbsp;groups[groupName]))&nbsp;{ &nbsp;&nbsp;groups[groupName].push(myArray[i].color);}如果没有jQuery,您可能希望添加一个与jQuery的函数相同的函数inArray:Array.prototype.contains&nbsp;=&nbsp;function(value)&nbsp;{ &nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;this.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this[i]&nbsp;===&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;false;}然后像这样使用它:if&nbsp;(!groups[groupName].contains(myArray[i].color))&nbsp;{ &nbsp;&nbsp;groups[groupName].push(myArray[i].color);}请注意,在这两种情况下,由于所有额外的迭代,您都会放慢速度,所以如果您不需要避免结果数组中的重复颜色条目,我建议您避免这段额外的代码。那里
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript