我有一个像这样的对象数组:
// 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.some
的O(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/