JS:将数组的字符串与对象字段进行比较

时间:2018-01-25 07:36:56

标签: javascript ecmascript-6

有一个对象,代表用户的角色:

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

4 个答案:

答案 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']));