Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中将两个不同的对象数组组合成一个新的对象数组?_Javascript - Fatal编程技术网

如何在javascript中将两个不同的对象数组组合成一个新的对象数组?

如何在javascript中将两个不同的对象数组组合成一个新的对象数组?,javascript,Javascript,我有两个具有相同news_id但属性不同的对象数组,我只是想知道如何组合它们并获得一个新的对象数组 例如: let arr1 = [{ news_id: 1, title: "title1" }, { news_id: 2, title: "title2" }, { news_id: 3, title: "title3" }, { news_id: 4, title: "title4" }, ] let

我有两个具有相同news_id但属性不同的对象数组,我只是想知道如何组合它们并获得一个新的对象数组

例如:

let arr1 = [{
    news_id: 1,
    title: "title1"
  },
  {
    news_id: 2,
    title: "title2"
  },
  {
    news_id: 3,
    title: "title3"
  },
  {
    news_id: 4,
    title: "title4"
  },
]

let arr2 = [{
    news_id: 3,
    count: 3
  },
  {
    news_id: 4,
    count: 4
  }
]
我想得到:

[
  {news_id: 1, title: "title1", count: 0},
  {news_id: 2, title: "title2", count: 0},
  {news_id: 3, title: "title3", count: 3},
  {news_id: 4, title: "title4", count: 4}
]

这可以按如下方式进行。此外,这是通用的,将包含相同新闻id的所有属性,而不仅仅是计数和标题

let arr1 = [
              {news_id: 1, title: "title1"},
              {news_id: 2, title: "title2"},
              {news_id: 3, title: "title3"},
              {news_id: 4, title: "title4"},
           ]


let arr2 = [
             {news_id: 3, count: 3},
             {news_id: 4, count: 4}
           ]

let result = Object.values(([...arr1, ...arr2].reduce((acc, d) => (acc[d.news_id] = { count:0, ...acc[d.news_id], ...d }, acc) ,{})))

这里有一个更简单的解决方案。我只需迭代
arr1
并从匹配的
arr2
项(如果有)中添加
count

for (item of arr1) {
    let arr2item = arr2.find(item2 => item2.news_id === item.news_id);
  item['count'] = arr2item ? arr2item.count : 0;
};

看起来不错,但意图不是很清楚

您可以使用
forEach
filter
实现这一点,如下所示:

arr1.forEach(i => i.count = (arr2.find(j => j.news_id == i.news_id) || { count: 0 }).count)
在下面试试

让arr1=[{
新闻编号:1,
标题:“标题1”
},
{
新闻编号:2,
标题:“标题2”
},
{
新闻编号:3,
标题:“标题3”
},
{
新闻编号:4,
标题:“标题4”
},
]
设arr2=[{
新闻编号:3,
计数:3
},
{
新闻编号:4,
计数:4
}
]
arr1.forEach(i=>i.count=(arr2.find(j=>j.news_id==i.news_id)|{count:0}).count);

控制台日志(arr1)在您的情况下,以获得所需的结果。我建议您应该尝试老派

下面是已完成的示例检查它

您可以采取一种方法来收集所有给定的数据和计数。然后渲染最终结果

var array1=[{news\u id:1,title:“title1”},{news\u id:2,title:“title2”},{news\u id:3,title:“title3”},{news\u id:4,title:“title4”},
array2=[{news\u id:3,count:3},{news\u id:4,count:4}],
结果=Array.from(
阵列2
.减少(
(m,{news\u id,count})=>(m.get(news\u id).count+=count,m),
array1.reduce((m,o)=>m.set(o.news_id,Object.assign({},o,{count:0})),新映射)
)
.values()
);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
到目前为止您尝试过什么?我尝试过使用嵌套循环,但它只返回相同ID的元素。@hackrack,如果它帮助您实现了您想要的,请将答案标记为可接受的解决方案。谢谢。是的,@NickParsons我故意采用通用方法,这样其他属性也可以得到处理。虽然我也添加了“count”以更具体。啊,是的,很抱歉没有看到你的评论。
let arr1 = [{
    news_id: 1,
    title: "title1"
  },
  {
    news_id: 2,
    title: "title2"
  },
  {
    news_id: 3,
    title: "title3"
  },
  {
    news_id: 4,
    title: "title4"
  }
]

let arr2 = [
    {
    news_id: 3,
    count: 3
  },
  {
    news_id: 4,
    count: 4
  }
]


arr1.forEach(function (e,i) {
    var flag = false;
  arr2.forEach(function (obj, j) {
        if (e.news_id === obj.news_id) {
            e.count = obj.count;
      flag = true;
        }
    });
  if(!flag){
    e.count = 0;
  }
});