javascript - 如何使用 reduce 合并 JavaScript 对象数组?

标签 javascript ecmascript-6

这里有很多关于合并 javaScript 数组对象的帖子与我的问题相关,其中大多数都是合并 2 个数组,在我的情况下是不同的。

我有来自 API 的 JSON,我映射并过滤了它们,因为我只需要“标签”

这是我的代码:

JSON.map((key) => (key.tags))
.filter(function (element) {
    return element !== undefined;
})

这是我的结果:

   [ 
      { 
    "web_devt": { 
      "item_id": "858850847", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "web_devt": { 
      "item_id": "1004644524", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "pdo": { 
      "item_id": "1056300113", 
      "tag": "pdo" 
    }, 
    "php": { 
      "item_id": "1056300113", 
      "tag": "php" 
    }, 
    "web_devt": { 
      "item_id": "1056300113", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "parallax scrolling": { 
      "item_id": "1087678088", 
      "tag": "parallax scrolling" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2435593852", 
      "tag": "react" 
    } 
  }, 
  { 
    "javascript": { 
      "item_id": "2435595088", 
      "tag": "javascript" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2465629468", 
      "tag": "react" 
    } 
  } 
] 

我想像这样合并它们:

[
{
"web_devt": [
    item_id: "765558416", 
        item_id: "765558416",
        item_id: "765558416",
        ...]
},
 {
"react": [
    item_id: "765558416",
    item_id: "765558416",
    item_id: "765558416",
    ...]
},
{
"JavaScipt": [
    item_id: "765558416",
    item_id: "765558416",
    item_id: "765558416",
    ...]
}

]

等等... 基本上所有相同的标签都会合并 你如何在 reduce 或任何解决方案中做到这一点,而不是 loadash 或任何第三方?

最佳答案

您想要的输出语法无效。您不能拥有带键的数组,也不能拥有具有多个同名键的对象。

但是,如果您想要一个 id 数组,您可以使用 reduce 并对数据进行分组,对于单个项目使用 Object.entries获取对象中的键和值。

var data = [ 
  { 
    "web_devt": { 
      "item_id": "858850847", 
      "tag": "web_devt" 
  } 
  }, 
  { 
    "web_devt": { 
      "item_id": "1004644524", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "pdo": { 
      "item_id": "1056300113", 
      "tag": "pdo" 
    }, 
    "php": { 
      "item_id": "1056300113", 
      "tag": "php" 
    }, 
    "web_devt": { 
      "item_id": "1056300113", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "parallax scrolling": { 
      "item_id": "1087678088", 
      "tag": "parallax scrolling" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2435593852", 
      "tag": "react" 
    } 
  }, 
  { 
    "javascript": { 
      "item_id": "2435595088", 
      "tag": "javascript" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2465629468", 
      "tag": "react" 
    } 
  } 
] 

const res = data.reduce((acc, item) => {
  Object.entries(item).forEach((attr) => {
    const [key,value] = attr;
    if(value.tag !== undefined) {
      if (acc[key]){
        acc[key].push(value.item_id);
      }
      else {
        acc[key] = [value.item_id];
      }
    }
  });
  
  return acc;
}, {})
console.log(res);

关于javascript - 如何使用 reduce 合并 JavaScript 对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54898539/

相关文章:

javascript - Excel 导出出现错误 : Failed - Network Error on large exports

Javascript setter - 如何获取 setter 内部的 setter 名称?

javascript - 在 JavaScript ES6 中,for-in 循环和 for-of 循​​环中,变量 i 在 block 的每次迭代后不再存在?

reactjs - 是否可以将非组件类连接到 redux 存储?

javascript - 加起来不等于 100% 的百分比

javascript - 使用 ES6 箭头函数设置事件监听器

javascript - 是否有解决方案可以让字体大小 slider 影响 body 标签,但只需要它影响某些 css 类

javascript - PIXI JS 优先调用鼠标悬停事件

angular - 为什么我的属性没有在 "Scope"内更新?

javascript - 使用按钮在 wordpress 中添加这个小的 jquery 操作