Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.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_Replace_Merge_Duplicates_Associative Array - Fatal编程技术网

Javascript 如何在关联数组中组合重复项?

Javascript 如何在关联数组中组合重复项?,javascript,replace,merge,duplicates,associative-array,Javascript,Replace,Merge,Duplicates,Associative Array,找出JavaScript数组是否包含重复项并将其合并到新数组中的最简洁有效的方法是什么 我尝试了Lodash/d3/barrelandejs,但没有一个生成干净的结果,所以我尝试了以下代码-> var-arr=[ { “头衔”:“我唯一的头衔”, “链接”:“域名链接到我的唯一标题”, “图像”:“someurlto/my unique title image”, “日期”:“2019年7月29日星期一02:25:08-0000”, “站点”:“站点1” }, { “标题”:“重复标题”, “

找出JavaScript数组是否包含重复项并将其合并到新数组中的最简洁有效的方法是什么

我尝试了Lodash/d3/barrelandejs,但没有一个生成干净的结果,所以我尝试了以下代码->

var-arr=[
{
“头衔”:“我唯一的头衔”,
“链接”:“域名链接到我的唯一标题”,
“图像”:“someurlto/my unique title image”,
“日期”:“2019年7月29日星期一02:25:08-0000”,
“站点”:“站点1”
},
{
“标题”:“重复标题”,
“链接”:“somedomainlinkto-a-duplicate-title/”,
“image”:“randomurlto/a-duplicate-title.jpg”,
“日期”:“太阳,2019年8月25日15:52:59-0000”,
“站点”:“站点1”
},
{
“标题”:“重复标题”,
“链接”:“otherdomainlinkto-a-duplicate-title/”,
“image”:“anotherurlto/duplicate title.jpg”,
“日期”:“太阳,2019年8月25日21:09:37-0000”,
“站点”:“站点2”
},
{
“标题”:“重复标题”,
“链接”:“someotherdomainlinkto-a-duplicate-title/”,
“图像”:“someurlto/aduplicatetitle.jpg”,
“日期”:“2019年8月24日星期六18:43:38-0000”,
“站点”:“站点3”
},
{
“标题”:“其他副本:标题”,
“链接”:“任何域链接到其他重复标题/”,
“image”:“anotherdomainurlto/other replicate title.jpg”,
“日期”:“2019年8月26日星期一00:37:28-0000”,
“站点”:“站点2”
},
{
“标题”:“其他副本:标题”,
“链接”:“任何其他域链接到其他重复标题/”,
“图片”:“exampleurlto/hjKGHK45huu.jpg”,
“日期”:“2019年8月26日星期一00:37:28-0000”,
“站点”:“站点5”
},
{
“标题”:“其他唯一标题”,
“链接”:“anydomainlinkto other unique title/”,
“image”:“anyotherurlto/img/other title.jpg”,
“日期”:“2019年8月26日星期一09:18:10-0000”,
“站点”:“站点3”
}
];
Array.prototype.groupBy=函数(道具){
var arr=此;
var partialResult={};
var imgResult={};
arr.forEach(el=>{
var grpObj={};
var grpImg={};
props.forEach(prop=>{
grpObj.title=el.title;
grpImg.image=el.image;
});
var key=JSON.stringify(grpObj);
var-keyImg=JSON.stringify(grpImg);
如果(!imgResult[key]){
imgResult[key]=grpImg.image;
}否则{
imgResult[key]=el.image;
}
如果(!partialResult[key])partialResult[key]=[];
部分结果[key]。推送(
{
链接:el.link,
地点:el.site,
日期:el.date
});
});
var finalResult=Object.keys(partialResult,imgResult).map(key=>{
var keyObj=JSON.parse(key);
keyObj.links=partialResult[key];
keyObj.image=imgResult[key];
返回keyObj;
})
返回finalResult;}
var filtered=arr.groupBy(['title']);

console.log(过滤)在构建用于分组的json对象之前,我只是将标题小写。我会使用对象解构来清理东西,以及一个哈希表,如果您在其中硬编码属性,我看不出通用
Array.prototype.groupBy有什么意义:

  const hash = {}, result = [];

  for(const { title, link, image, date, site } of input) {
    const key = JSON.stringify({ title: title.toLowerCase().replace(/ /g, ""), });
    if(hash[key]) {
      hash[key].push({ link, date, site });
    } else {
      result.push({ title, image, links: hash[key] = [{ link, date, site }], });
    }
 }

似乎要按不带空格的小写标题分组:

var arr=[{“title”:“My unique title”,“link”:“domainlink to My unique title”,“image”:“someurlto/My unique title image”,“date”:“Mon,2019年7月29日02:25:08-0000”,“site”:“site1”},{“title”:“A duplicate title”,“link”:“somedomainlinkto-A-duplicate-title/”,“image”:“randomurlto/A-duplicate-title.jpg”,“date”:“Sun,2019 8月25日15:52-0000”,“site”:“site1”},{“title”:“重复标题”,“链接”:“otherdomainlinkto-A-duplicate-title/”,“图像”:“anotherurlto/duplicate title.jpg”,“日期”:“Sun,2019年8月25日21:09:37-0000”,“site”:“site2”},{“title”:“重复标题”,“链接”:“someotherdomainlinkto-A-duplicate-title/”,“图像”:“someurlto/aduplicatetitle.jpg”,“日期”:“Sat,2019年8月24日18:43-0000”,“站点”“:”site3“},{”title“:”Other duplicate:title“,”link“:”anydomainlinkto Other duplicate title/”,“image“:”anotherdomainurlto/Other duplicate title.jpg”,“date“:”Mon,2019年8月26日00:37:28-0000”,“site“:”site2“},{”title“:”Other duplicate:title“,”link“:”anyotherdomainlinkto Other duplicate title/”,”image“,”exampleurlto/hjKGHK45huu.jp“2019年8月26日星期一00:37:28-0000”,“站点”:“站点5”},{“标题”:“其他唯一标题”,“链接”:“anydomainlinkto其他唯一标题/”,“图像”:“anyotherurlto/img/Other title.jpg”,“日期”:“2019年8月26日星期一09:18:10-0000”,“站点”:“站点3”}]
var result=arr.reduce((o,{title,image,link,date,site},k)=>(
(o[k=title.toLowerCase().replace(//g',)]=o[k]| |{title,image,links:[]})
.links.push({date,site,link}),o),{})

console.log(Object.values(result))
js区分大小写,带大写字母的属性名称不是小写名称的副本。如果你想让它们平等测试,你需要将它们转换为普通大小写,并将其用作分组键。好的方法,但你能澄清你的答案吗?感谢你的帮助,但给出的代码不适合。运行它,你会看到…困难也就是说,您所展示的代码片段都会产生不同的结果。我同意您的说法“我的代码很乱”…如果您忘记了代码,只是比较数组,您会看到我尝试合并重复的[title](大写:“:”)的[link]到一个新的数组中。也许这是不可能的?这正是我的解决方案所做的?我很抱歉这么说,因为你试图帮助我,这很酷,但是…你能用第一个数组将你的代码发布到代码片段中吗?因为它不适用于meThis,但它不是代码高尔夫。这个变量作为一个参数和逗号运算符实际上只是se可读性(和性能,可能)完美!正是我想要的!有效