基于如下的快速模型,我需要将URL路由对象添加到我的应用程序中的Array属性。
在addAppRoute(routeObbj)
下面的函数中我想添加一个检查,以查看添加的新路由是否已存在于属性this.cache.webDevAppRoutes
如何确保不添加重复项?它需要基于重复的module
和action
是相同的
var app = {
cache: {
webDevAppRoutes: [],
},
addAppRoute: function(route) {
var routes = this.cache.webDevAppRoutes;
routes.push(route);
},
getAppRoutes: function() {
var routes = this.cache.webDevAppRoutes;
console.log(routes);
},
addBookmarkAppRoutes: function() {
this.addAppRoute({
module: 'bookmarks',
action: 'view',
params: [{
id: 123
}],
});
this.addAppRoute({
module: 'bookmarks',
action: 'edit',
params: [{
id: 123
}],
});
this.addAppRoute({
module: 'bookmarks',
action: 'add',
params: [],
});
},
}
答案 0 :(得分:2)
只需遍历数组并检查它是否已经包含module
和action
的条目。您可以使用Array#some
,例如:
if (routes.some(function(r) { return r.module == route.module && r.action == route.action)) {
// It's a duplicate
}
一旦对其回调的调用返回真值, Array#some
就会返回true
;否则,它返回false
。
在ES2015中,这更简洁:
if (routes.some(r => r.module == route.module && r.action == route.action)) {
// It's a duplicate
}
答案 1 :(得分:1)
只有Map
已经添加的路线:
var webDevAppRoutes = new Map();
function addAppRoute(route) {
var key = [route.module, route.action].join();
if(!webDevAppRoutes.has(key))
webDevAppRoutes.set(key, route);
}
addAppRoute({
module: 'bookmarks',
action: 'view',
params: [{
id: 123
}],
});
addAppRoute({
module: 'bookmarks',
action: 'edit',
params: [{
id: 123
}],
});
addAppRoute({
module: 'bookmarks',
action: 'add',
params: [],
});
addAppRoute({
module: 'bookmarks',
action: 'add',
params: 'once again',
});
console.log([...webDevAppRoutes.values()])

对于ES5,找一个polyfill或使用POJO而不是Map
。