有一个对象,代表用户的角色:
var TOOLBAR_CONFIG = [{
name: 'document',
items: ['Source', '-', 'Save', 'NewPage', 'DocProps', 'Preview', 'Print', '-', 'Templates']
}, {
name: 'clipboard',
items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']
}, {
name: 'editing',
items: ['Find', 'Replace', '-', 'SelectAll', '-', 'SpellChecker', 'Scayt']
}, {
name: 'forms',
items: ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton',
'HiddenField'
]
},
'/', {
name: 'basicstyles',
items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']
}, {
name: 'paragraph',
items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv',
'-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl'
]
}, {
name: 'links',
items: ['Link', 'Unlink', 'Anchor']
}, {
name: 'insert',
items: ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']
},
'/', {
name: 'styles',
items: ['Styles', 'Format', 'Font', 'FontSize']
}, {
name: 'colors',
items: ['TextColor', 'BGColor']
}, {
name: 'tools',
items: ['Maximize', 'ShowBlocks', '-', 'About']
}
];
ko.bindingHandlers.ckeditor = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var ignoreChanges = false;
var options = ko.utils.extend({
toolbar: TOOLBAR_CONFIG,
removePlugins: 'elementspath'
}, allBindings.get('ckeditorOptions') || {});
var modelValue = valueAccessor();
var editor = CKEDITOR.replace(element, options);
editor.on('change', function() {
ignoreChanges = true;
modelValue(editor.getData());
ignoreChanges = false;
});
modelValue.subscribe(function(newValue) {
var editor = new CKEDITOR.dom.element(element).getEditor();
if (!(ignoreChanges))
editor.setData(newValue);
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
if (editor) {
CKEDITOR.remove(editor);
};
});
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var editor = new CKEDITOR.dom.element(element).getEditor();
console.log(ko.unwrap(valueAccessor()));
editor.setData(ko.unwrap(valueAccessor()), null, true);
}
};
我需要将一些元素传递给函数,检查该角色是否在用户对象中具有真值。
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
}
我遇到了一些问题,因为角色的命名略有不同。
我还想到了使用result = hasPermission(user, ['editor', 'admin']) // true
result = hasPermission(user, ['editor', 'translator']) // false
,因为我只需检查一个真值。
_.some()
答案 0 :(得分:3)
你在做什么并不是思考它的正确方法。
用户角色不是单个属性,而是角色集合。 所以你的用户对象应该是类似
的模型const MyUser = {
roles: ["Admin","Editor"]
}
那么你可以通过使用如下函数来检查用户是否具有给定的角色:
function UserHasAnyRole(user,roleKeys)
{
if(user && user.roles && roleKeys && roleKeys.length)
{
return user.roles.filter(function(r){
return roleKeys.filter(function(k){ return k == r;}).length>0;
}).length > 0;
}
return false;
}
var neededRoles = ["Admin","Translator"];
if(UserHasAnyRole(MyUser,neededRoles))
{
// do stuff
}
这种思考方式可以更好地扩展,因为从长远来看,个别财产不是一种可持续的方式
编辑:考虑输入角色的阵营。这个没有经过测试,所以可能会有一些语法错误,但你明白了......
答案 1 :(得分:1)
这是一个最接近您情况的解决方案,不会改变对象和功能的形状。
你可以像这样使用some
,这很简单:
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
};
function hasPermission (user, roles) {
return roles.some(role => user["is" + role[0].toUpperCase() + role.substring(1)]);
}
console.log(hasPermission(user, ['editor', 'admin']));
console.log(hasPermission(user, ['editor', 'translator']));

希望这会对你有帮助!
答案 2 :(得分:0)
您可以使用相同的属性名Object.entries()
来获取属性数组,对象的值对以及Array.prototype.some()
和Array.prototype.includes()
以检查值是否匹配
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
}
const hasPermission = (o, keys) =>
Object.entries(o).some(([key, prop]) => prop && keys.includes(key));
let result = hasPermission(user, ["isEditor", "isAdmin"]);
console.log(result);
result = hasPermission(user, ["isEditor", "isTranslator"]);
console.log(result);

答案 3 :(得分:0)
这是另一种解决方案。
const user = {
isEditor: false,
isAdmin: true,
isTranslator: false
};
function hasPermission (user, roles) {
const userRoles = Object
.entries(user)
.filter(([_, val]) => val)
.map(([key, _]) => key.replace('is', '').toLowerCase());
return roles.some(x => userRoles.includes(x));
}
console.log(hasPermission(user, ['editor', 'admin']));
console.log(hasPermission(user, ['editor', 'translator']));