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

标签 javascript arrays object duplicates

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

// 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'}]

编辑:抱歉,我忘了提及这是旧代码。我无法使用“Set”和“some”等功能

最佳答案

您可以先检查累加器中的任何对象中是否存在 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),而不是Array.prototype.someO(N)):

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);

关于javascript - 如何使用javascript中reduce函数中的属性值跳过重复对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56183461/

相关文章:

javascript - Laravel 5.2 请求返回 null AJAX

c++ - Append 在 C++ 中的数组链接列表中不起作用

c++ - 使用 `__m256i` 中的值高效访问数组 - SIMD

javascript - 如果对象的名称存储为变量,则从对象获取值?

java - 如何访问作为另一个类中的对象的局部变量? - java

javascript - 从 NavContainer 内的 XMLview 获取元素

javascript - 在 DOM 中移动更多具有相同类的元素

ruby - ruby 中的数组和范围有什么区别?

Javascript 原型(prototype)继承不起作用

javascript - 原型(prototype)内包装