为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

jeck猫 2021-06-01 17:35:09
我有一个像这样的对象数组:// other properties of the object omitted for brevity// this array can potentially contain upto 50 objects like thisvar 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'}]编辑:对不起,我忘了提到这是遗留代码。我不能使用像“设置”和“一些”这样的功能
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

您可以先检查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);


查看完整回答
反对 回复 2021-06-03
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-06-03
?
不负相思意

TA贡献1777条经验 获得超10个赞

您可以首先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"

  }

}


查看完整回答
反对 回复 2021-06-03
  • 3 回答
  • 0 关注
  • 298 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信