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

Javascript 减少具有不相同(但相似/重叠)值的对象数组?

Javascript 减少具有不相同(但相似/重叠)值的对象数组?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,考虑以下对象: [ { highlight: "He likes cake", location: "29" }, { highlight: "He likes cake, but not chocolate", location: "29-32" }, { highlight: "He likes cake, but not", location: "29-31" }, { highlight: "He likes cake, but not chocolate cake",

考虑以下对象:

[
  { highlight: "He likes cake", location: "29" },
  { highlight: "He likes cake, but not chocolate", location: "29-32" },
  { highlight: "He likes cake, but not", location: "29-31" },
  { highlight: "He likes cake, but not chocolate cake", location: "29-34" },
  { highlight: "Jane said Hi.", location: "40" },
  { highlight: "I like her brother, but not her mum", location: "45-50" },
  { highlight: "I liked her brother", location: "45" },
  { highlight: "Some other irrelevant sentence", location: "54" },
  { highlight: "and this is why I liked her!", location: "55-60" },
  { highlight: "Yes, and this is why I liked her!", location: "53-60" },
]
它代表了某种亮点。我想浏览一下这个数组,每当同一部分被高亮显示多次时,我想删除所有的“倍数”,只保留最后一个元素

例如:数组中的这4个元素或多或少都覆盖相同的位置:

  { highlight: "He likes cake", location: "29" },
  { highlight: "He likes cake, but not chocolate", location: "29-32" },
  { highlight: "He likes cake, but not", location: "29-31" },
  { highlight: "He likes cake, but not chocolate cake", location: "29-34" },
其中,我想删除所有“重复项”,只保留最新的,留给我的是:

  { highlight: "He likes cake, but not chocolate cake", location: "29-34" },
当然,在这里谈论重复是错误的,因为元素在技术上是不同的。这正是我的问题所在。我不知道如何减少这个数组

上述数组的预期输出:

[
  { highlight: "He likes cake, but not chocolate cake", location: "29-34" },
  { highlight: "Jane said Hi.", location: "40" },
  { highlight: "I liked her brother, but not her mum.", location: "45-50" },
  { highlight: "Some other irrelevant sentence", location: "54" },
  { highlight: "Yes, and this is why I liked her!", location: "53-60" },
]
尝试 到目前为止,我已经尝试过(基于这里的答案),但它只适用于相同的值:

const map = data.reduceRight((r, e) => {
  const key = `${e.highlight}|${e.location}`;
  if (!r.has(key)) r.set(key, e);
  return r;
}, new Map);

const uniq = [...map.values()];
console.log(uniq)

编辑:将示例更改为包含具有不同初始编号的位置。

主要问题是定义相似性函数。根据您提供的示例,我推断,如果两个条目的
位置
范围重叠,则它们是相似的。因此,使用此相似性定义,您可以通过以下方式
减少
数据
数组:

var数据=[
{亮点:“他喜欢蛋糕”,地点:“29”},
{亮点:“他喜欢蛋糕,但不喜欢巧克力”,地点:“29-32”},
{亮点:“他喜欢蛋糕,但不喜欢”,地点:“29-31”},
{亮点:“他喜欢蛋糕,但不喜欢巧克力蛋糕”,地点:“29-34”},
{亮点:“简说你好”,地点:“40”},
{突出显示:“我喜欢她的兄弟,但是”,位置:“45”},
{亮点:“我喜欢她的哥哥,但不喜欢她的妈妈。”,地点:“45-50”},
{突出显示:“其他一些不相关的句子”,位置:“54”},
];
函数相似(h1,h2){
const[loc1Start,loc1End]=h1.location.split('-').map(l=>parseInt(l));
const[loc2Start,loc2End]=h2.location.split('-').map(l=>parseInt(l));
返回(loc1Start>=loc2Start&&loc1Start loc2Start&&loc1End | | loc1Start){
如果(A相似(当前,会计科目[会计科目长度-1]))会计科目[会计科目长度-1]=当前;
其他附件推送(当前);
返回acc;
},[数据[0]]);

console.log(result);
您可以检查范围,如果它们重叠,则选择范围更大的范围。
const getRange=s=>(s+'-'+s).split('-').slice(0,2).map(Number);
var数组=[{highlight:“他喜欢蛋糕,但不喜欢巧克力”,位置:“29-32”},{highlight:“他喜欢蛋糕,但不喜欢巧克力”,位置:“29-34”},{highlight:“简说你好”,位置:“40”},{highlight:“我喜欢她的兄弟,但是”,位置:“45”},{highlight:“我喜欢她的哥哥,但不喜欢她的妈妈。”,地点:“45-50”},{突出显示:“其他一些无关的句子”,地点:“54”},{突出显示:“他喜欢蛋糕”,地点:“29”},
结果=数组。减少((r,o)=>{
var[aStart,aEnd]=getRange(o.location),
B开始,本德,
index=r.findIndex(({location})=>{
[B开始,弯曲]=getRange(位置);
返回(aStart>=bStart&&aEnd=bEnd);
});
如果(索引==-1){
r、 推(o);
}否则{
如果(aStart=bEnd)r[index]=o;
}
返回r;
}, []);
console.log(结果);

。作为控制台包装{最大高度:100%!重要;顶部:0;}
是否保证“重复”"在数组中总是彼此相邻吗?哦,好的问题。现在我会说是的,这是最有可能的情况,我可以忍受有一些重复,如果这意味着代码将更直接和容易阅读。你认为重复……重叠的页面或string@DennisVash如果位置重叠,那么字符串。如果字符串重叠,位置不一定重叠,作者可能会使用类似的短语两次,用户也可能会高亮显示两次。因此最好选择位置。请定义“覆盖大致相同的位置”更严格地说。在您给出的示例中,所有位置都以相同的数字开始,这就是您要查找的条件吗?这只适用于给定的顺序。例如,如果您将第一个项目移动到底部,则在结果数组的末尾也会得到该项目。@NinaScholz是的,我曾询问OP类似的项目是否相邻,并且y说我们可以做出这样的假设。但是这假设了较长的射程是正确的,而不是数组中最后出现的射程,对吗?无可否认,在给定的例子中,这两种情况恰好重合,但不一定总是如此。