3 回答

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

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

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"
}
}
添加回答
举报