如何在javascript的reduce函数中使用属性值跳过重复的对象?

我有一个像这样的对象数组:


// other properties of the object omitted for brevity

// this array can potentially contain upto 50 objects like this

var myArray = [{url: 'http://linkA'}, {url: 'http://linkB'}, {url: 'http://linkA'}]

我正在尝试应用 reduce 函数来创建一个像这样的新对象:


  var newArray = myArray.reduce(function(acc, current, index){

  var newObj = {};

  newObj['strata']  = 'kit';

  newObj['href'] = current['url'];

  acc.push(newObj);

  return acc;  

}, [])

但我不想包含重复的对象(使用对象的“url”属性测试的“重复”)。我如何修改我的 reduce 函数来跳过这些类型的对象并生成一个


[{strata: kit, href: 'http://linkA'}, {strata: kit, href: 'http://linkB'}]

编辑:对不起,我忘了提到这是遗留代码。我不能使用像“设置”和“一些”这样的功能


jeck猫
浏览 299回答 3
3回答

ITMISS

您可以先检查url累加器中的任何对象中是否存在 :var myArray = [{  url: 'http://linkA'}, {  url: 'http://linkB'}, {  url: 'http://linkA'}];var newArray = myArray.reduce(function(acc, { url }, index) {  if (acc.some(obj => obj.href === url)) {    return acc;  }  acc.push({    strata: 'kit',    href: url  });  return acc;}, [])console.log(newArray);对于O(N)复杂性而不是O(N^2),将每个 URL 添加到外部Set(其查找是O(1),而不是O(N)for Array.prototype.some):var myArray = [{  url: 'http://linkA'}, {  url: 'http://linkB'}, {  url: 'http://linkA'}];const urls = new Set();var newArray = myArray.reduce(function(acc, { url }, index) {  if (urls.has(url)) {    return acc;  }  urls.add(url);  acc.push({    strata: 'kit',    href: url  });  return acc;}, [])console.log(newArray);或者,在 ES5 中,使用对象而不是 Set:var myArray = [{  url: 'http://linkA'}, {  url: 'http://linkB'}, {  url: 'http://linkA'}];var urls = {};var newArray = myArray.reduce(function(acc, obj, index) {  var url = obj.url;  if (urls[url]) {    return acc;  }  urls[url] = true;  acc.push({    strata: 'kit',    href: url  });  return acc;}, [])console.log(newArray);

吃鸡游戏

使用some:var myArray = [{url: 'http://linkA'}, {url: 'http://linkB'}, {url: 'http://linkA'}];var newArray = myArray.reduce(function(acc, { url }, index) {  if (Object.values(acc).some(({ href }) => href === url)) {    return acc;  }  acc.push({    strata: 'kit',    href: url  });  return acc;}, [])console.log(newArray);

不负相思意

您可以首先url使用所有 unique s Set。然后使用map和速记属性名称创建对象:const myArray = [{url: 'http://linkA'}, {url: 'http://linkB'}, {url: 'http://linkA'}],      uniqueUrls = new Set(myArray.map(a => a.url)),      strata = "kit",      output = [...uniqueUrls].map(href => ({ strata, href }));console.log(output)如果您不能使用 ES2015+ 功能,您可以将一个对象作为累加器,并将每个唯一的对象url作为键。这样你url在累加器中只会得到一个。然后遍历对象并获取合并对象的值var myArray = [{url: 'http://linkA'}, {url: 'http://linkB'}, {url: 'http://linkA'}];var merged = myArray.reduce(function(acc, current) {  acc[current.url] = current;  return acc;}, {})var output = [];for(var key in merged) {  output.push(merged[key])}console.log(output)这是合并对象的样子:{  "http://linkA": {    "url": "http://linkA"  },  "http://linkB": {    "url": "http://linkB"  }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript