精华内容
下载资源
问答
  • let roles = ['admin','text','shop'] //也可以使用数组对象,请根据实际业务需求来选择哪种方式 let asyncRouter = [ { path:'菜单admin', meta:{roles:['admin']} }, { path:'菜单text', m

    vue 递归权限菜单,这里随便写一个vue-router格式的菜单实现一个简单的权限菜单

    //以下数据根据vue-router 格式随意编写的,请根据实际业务需求来选择哪种方式
    let roles = ['admin','text','shop'] //也可以使用数组对象,请根据实际业务需求来选择哪种方式
    let asyncRouter = [
    		{
    			path:'菜单admin',
    			meta:{roles:['admin']}
    		},
    		{
    			path:'菜单text',
    			meta:{roles:['text']}
    		},
    		{
    			path:'菜单shop',
    			meta:{roles:['shop']},
    			children:[
    				{
    					path:'菜单shop.1',
    					meta:{}
    				},
    				{
    					path:'菜单shop.2',
    					meta:{
    						roles:['shop']
    					},
    					children:[
    						{
    							path:'菜单shop.2.1',
    							meta:{
    								roles:['shop']
    							},
    							children:[
    								{
    									path:'菜单shop.2.1.1',
    									meta:{
    										roles:['shop']
    									},
    								}
    							]
    						}
    					]
    				}
    			]
    		},
    		{
    			path:'菜单',
    			meta:{roles:['else']}
    		}
    	]
    
    //router:路由   roles:权限
    function routers(router,roles){
        const newAsyncRouter = router.filter(item=>{
            if(isRoles(roles,item)){ //权限存在
                if(item.children && item.children.length){//有子菜单
    				item.children = routers(item.children)
    			}
    			return true
            }
            return false
        })
        return newAsyncRouter
    }
    
    
    //是否有该权限
    //roles:权限   router每一项路由
    function isRoles(roles,router){
        if(router.meta && router.meta.roles){ //当前路由有权限设置
            return roles.some(role => router.meta.roles.includes(role))//权限存在返回true,不存在返回false,如果roles是数组对象的话,router.meta.roles.includes(role.keys)keys是你设置的keys值或者是后台返回给你的keys
        }
        return true //如果当前路由不需要权限 直接返回true
    }
    
    
    const router = routers(asyncRouter,roles) //最终得到的权限路由

     

    展开全文
  • 两个数组(时候A数组长、时候B数组长)不过我这边A数组是固定的 如(B数组长): A = [ {device_code: 'a', name:'a'}, {device_code: 'b', name:'b'} ] B = [ {device_code: 'a', name:'testA'}, {device_...

    两个数组(有时候A数组长、有时候B数组长)不过我这边A数组是固定的

    如(B数组长):

    A = [

    {device_code: 'a', name:'a'},

    {device_code: 'b', name:'b'}

    ]

    B = [

    {device_code: 'a', name:'testA'},

    {device_code: 'c', name:'testC'},

    {device_code: 'd', name:'testD'}

    ]

     

    如(A数组长):

    A = [

    {device_code: 'a', name:'a'},

    {device_code: 'b', name:'b'}

    ]

     

    B = [

    {device_code: 'a', name:'testA'}

    ]

     

    需求就是把A数组的数据判断是否(在B里面是否存在,存在的话就把name覆盖,没有的话就把name值改成 'found')

     

     

    解决方法

    需要根据数组的长度来决定(长的foreach写外面、短的foreac写里面)

    /*
    var A = [
    {device_code: 'a', name:'a'},
    {device_code: 'b', name:'b'}
    ]
    var B = [
    {device_code: 'a', name:'testA'},
    {device_code: 'c', name:'testC'},
    {device_code: 'd', name:'testD'}
    ]
    */
    var A = [
    {device_code: 'a', name:'a'},
    {device_code: 'b', name:'b'}
    ]
    var B = [
    {device_code: 'a', name:'testA'}
    ]
    console.log('A --- length ---' + A.length)
    console.log('B --- length ---' + B.length)
    
    var fatherArr = [] // 父数组(长)
    var sonArr = [] // 子数组(短)
    
     if (A.length >= B.length) { // 判断谁更长
       fatherArr = A
       sonArr = B
       // 循环判断
       fatherArr.forEach((fatherVal) => {
         sonArr.forEach((sonVal) => {
            if (sonVal.device_code === fatherVal.device_code) {
                console.log('A === ' + sonVal.device_code)
                fatherVal.name = sonVal.name // name
                fatherVal.state = 'true' // 做标记代表循环处理过了
              }
            })
          })
     } else {
       fatherArr = B
       sonArr = A
    	   // 循环判断
       fatherArr.forEach((fatherVal) => {
         sonArr.forEach((sonVal) => {
            if (sonVal.device_code === fatherVal.device_code) {
               console.log('B === ' + sonVal.device_code)
               sonVal.name = fatherVal.name // name
               sonVal.state = 'true' // 做标记代表循环处理过了
             }
          })
        })
     }
    
    A.forEach((val) => {
       if ('state' in val) {
          console.log('have state')
       } else {
          console.log('no have state')
          val.name = 'found'
       }
    })
    console.log(A)

     

    展开全文
  • 假设数组An个元素,数组Bn个元素。 看到这种题的时候,我们最直观的就是通过两层for循环来对比每个数组中的数字。因此A数组中的每个元素都会和B数组中的每个元素对比过一次,所以总共要对比的次数是n个n相加...

    问题的起因

    假设数组A有n个元素,数组B有n个元素。

    看到这种题的时候,我们最直观的就是通过两层for循环来对比每个数组中的数字。因此A数组中的每个元素都会和B数组中的每个元素对比过一次,所以总共要对比的次数是n个n相加(或者是n个m相加),也就是n2(或者为n x m).

    因此我们想能不能有更快的方法呢?让其中一个数组的查找的时间复杂度不再是O(n)就可以了。也就是我们在这个数组中查找一个数,不是通过遍历的方式。

    但是不是通过遍历的方式能在一个数组中找到一个自己想要的数吗?看起来必须有什么特殊的方法才行。

    我们再回过头来看数组是什么组成的:

    1.下标

    2.下标所代表的元素

     

    我们按位置查找时,数组的速度是O(1)的,因为我们只需要通过下标就可以定位那个元素。否则需要采用遍历的O(n)的方式。

    O(n)看起来好像速度还可以,其实想想看还真没有比它更慢的了,你都把遍历完一遍了当然知道有没有所需要的元素了。

    这时,我们就想到,如果用下标位置来标示所需的数字呢,而元素用来标记是否出现,出现1次就加1。比如说数组A中存在元素12,就在由数组B转换后的数组C中检查C[12]是否等于1.

    我们把数组B转换成数组C,所需要的时间也为O(n)

    那就使得对A数组的遍历仍为O(n),但检查数组A中的元素是否存在于数组C中则由原来的O(n)转换为O(1).

    所以总的时间复杂度为O(n+n)。

     

    看起来不错,但是问题来了,如果A中的数字很大并且很分散时,会造成数组C中大量的空间被浪费。比如说数组A是由{1,333,666}这三个元素,那么辅助数组C就需要667的大小,但是只用到了其中的3个,也就是664个空间是白浪费的。

    这种直接通过数组下标寻址的方法,在数组元素非连续的情况下,会造成大量空间浪费。

     

     

    那什么情况下数组中的数字会比较连续呢?还记得这张图吧,不记得的点这里

     

    也就是ASCII码。

    所以这种方式除了用来查找数字,也可以用来查找字母

    代码如下:(赶时髦用C来写,写的过程中感觉各种不适应啊。注:"abc"是作为指针传递,'abc'是作为整数传递,数组在作为参数时会退化为指针。)

     

    #include <stdio.h>
    #include <stdlib.h>


    char * FindSameChar(char *stringA, char *stringB){
    if(stringA == NULL || stringB == NULL ){
    return '\0';
    }

    const int containerSize = 128;
    unsigned int container[containerSize];
    for (unsigned int i=0; i<containerSize; i++)
    {
    container[i] = 0;
    }

    char *result = (char *)malloc(sizeof(stringA));
    char *key = stringA;
    while(*key != '\0')
    container[*(key++)]++;

    key = stringB;
    char *findResult = result;
    while(*key != '\0')
    {

    if(container[*key] >= 1){
    *findResult = *key;
    findResult++;
    }

    key++;
    }

    if (result != NULL)
    return result;
    else
    return '\0';
    }

     空间复杂度为O(1),因为这里我开的辅助内存大小为128是个常数。

     

    这种下标和数字紧耦合的方式使得我们这种方法受到了极大的限制,那么我们有没有办法“解耦”呢?

    也就是说,让1,和666不要离开这么远,中间空了665个空位。让他们尽可能的靠近些。这时候就需要通过一种方法来实现这种解耦,也就是说通过某个函数算出相应的位置,使得1和666之间的空格数尽量更小。

    这就是hash函数。

     

    取模算法

     hash技术很好的解决了直接寻址遇到的问题,但是这么做同时也引入了新的问题,通过hash函数算出来的位置可能会相同,一般就称为发生了“碰撞"。也就是虽然我们希望通过hash函数使得1和666的位置尽量能靠近些,但是可能某些hash函数算出来的结果就是1和666位置相同。一般发生这种情况有几种方式解决,二次hash和链接法。链接法用的是最多的,就是在同一个位置上创建一个链表。

    当然如果碰撞多了,hash表也变成了链结构,会极大的影响效率。当初某个BUG就是因为采用了某种hash算法导致产生大量的碰撞,使得服务器性能下降。

     

    hash表用的地方非常多,比如数据库中就是用了哈希表,通常采用的是除法hash方式。

    在用来设计哈希函数的除法散列法中,通过取k除以m的余数,来将关键字K映射到m个位置中的某个位置,也就是:

      hash(k) = k mod m;

    顺便值得一提的是,获取余数是个经常用到的方法,比如说两人跑步套圈,迷宫中的右手扶墙算法等。也就是说能让一个数不停的在一个指定的范围内打转。

    .NET中相应的实现是HashSet<T>,Dictionary<TKey,TValue>,Hashtable。

    当然这几种结构肯定有区别,下篇还要谈谈Equals和GetHashcode再说吧。

     

    一致性Hash算法

    如上面所说,最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K) mod N对应的机器。的确,这种结构是简单的,也是实用的。但是在一些高速发展的web系统中,这样的解决方案仍有些缺陷。随着系统访问压力的增长,缓存系统不 得不通过增加机器节点的方式提高集群的相应速度和数据承载量。增加机器意味着按照hash取模的方式,在增加机器节点的这一时刻,大量的缓存命不中,缓存 数据需要重新建立,甚至是进行整体的缓存数据迁移,瞬间会给DB带来极高的系统负载,设置导致DB服务器宕机。
     

    分布式缓存设计核心点:在设计分布式cache系统的时候,我们需要让key的分布均衡,并且在增加cache server后,cache的迁移做到最少。这里提到的一致性hash算法ketama的做法是:选择具体的机器节点不在只依赖需要缓存数据的key的hash本身了,而是机器节点本身也进行了hash运算。

    转载于:https://www.cnblogs.com/lwzz/archive/2012/02/15/2350903.html

    展开全文
  • JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false <script type="text/javascript"> alert([]==...

    Javascript怎么比较两个数组是否相同?
    JS怎么比较两个数组是否有完全相同的元素?
    Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false

    <script type="text/javascript">
            alert([]==[]);
            alert([]===[]);
    </script>

    要判断JS中的两个数组是否相同,需要先将数组转换为字符串,再作比较。以下两行代码将返回true

    <script type="text/javascript">
            alert([].toString()== [].toString());
            alert([].toString()===[].toString());
    </script>

    JS要比较两个数组是否有相同的元素,即两个数组所有元素都相同,但元素的顺序不一定一致。只就需要先将数组进行排序,再比较两个数组是否相等。
    试比较以下两行代码:

    <script type="text/javascript">
            alert([1,2,3].toString()== [3,2,1].toString());
            alert([1,2,3].sort().toString()== [3,2,1].sort().toString());
    </script>

     

    转载于:https://www.cnblogs.com/loveyouyou616/p/11276249.html

    展开全文
  • 二维数组查找

    2019-09-03 20:49:22
    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有该整数。 自己的...
  • 二维数组查找(编程题目)

    万次阅读 2020-01-26 19:53:09
    二维数组查找题目分析暴力求解O(nlgn)O(nlgn)O(nlgn)python代码如下:技巧法O(n)O(n)O(n)二维二分查找法O(lgn)O(lgn)O(lgn) 题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的...
  • 数组查找

    2014-11-03 09:37:00
    对于一维数组,通常会用到以下查找方法,来查找数组是否存在某个元素。 (一)逐个元素对比,找出要查找的对象 public static int search(int[] array, int value) { for(int i = 0; i< array.length; i...
  • * 二维数组对比,找出差异值数组返回 * @param $Array1 第一个数组 * @param $Array2 第二个数组 * @param $ArrayKey 两个数组需要比较的键 * @return array */ function Func_Array_Diff_Assoc2_Deep($Array1...
  • 主要介绍了JS取出两个数组中的不同或相同元素,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 1.如果只是需要判断是否包含相同元素而不是要找出相同元素哪些,直接放在set集合中,然后看set集合和数组长度是否一致即可 fun main() { val array = arrayOf(1, 7, 2, 4, 9, 2) val sameSet = mutableSetOf<...
  • 所以一个场景就是,后台返回数字,需要将数字转换为文字,而且需要跟字典选项对比,才能获取实时更新后的数据。 data(){ return{ arr1: [ { sex: '0', index: 123544 }, { sex: '1', index: ...
  • 第一种办法:遍历其中一个数组中的每个元素,然后在第二个数组中用二分查找法,检查是否存在相同的元素。其时间复杂度是O(nlog n).没有利用数组有序这个信息。 第二种办法:设置两个下标,分别初始化为两个数组的第...
  • 1.题目描述 ...因为二维数组是左到右递增的顺序排序的,那么咱可以从数组的最右上角开始进行对比,比右上角的值大的向下查找,如果小的话进行左移,如果越界,则说明二维数组中不存在该整数。 public cl...
  • 对比时先判断当前位置元素是否大于等于目标,优先查找左半段,这样就会先找到目标出现的最左位置 对比时先判断当前位置元素是否小于等于目标,优先查找右半段,这样就会先找到目标出现的最右位置 然后,加
  • otherCdnFilePath是个数组 // 提交校验版本号 let pathArr = this.editObj.otherCdnFilePath.concat(); pathArr.push(this.editObj.rateCdnFilePath); pathArr.push(this.editObj.healthCdnFilePath); pathArr.push...
  • // int a // int a[65] ...//里面65个int类型的数据,并且连续分布  占有的内存=sizeof(类型)*元素个数  引用数组的元素:数组名[下标],数组的下标从0开始  数组元素不能越界访问  
  • # 创建存储查找结果的文件 creatFile(){ # 获取文件所在位置 filePtth="$( cd "$( dirname "$0" )" && pwd )" echo "当前文件位置 $filePtth" fireName="文件名" allName="${filePtth}/${fireName}" ...
  • iOS 遍历数组查找字符串

    千次阅读 2016-10-21 19:01:08
    - (NSMutableArray *)bianli{   NSArray *arr = @[@"123",@"u",@"UID"];   NSMutableArray *newarr = [NSMutableArray array];  for (int i =0 ; icount; i++) {  if ([arr ...con
  • 最近做图片上传时,当修改图片时会用到判断两个数组是否相同。虽然最近没有采取比较两个数组是否相同,但也因此研究了下比较两个数组是否相同的方法,首页在网上查了一下相关资料更多的是用到数组转化为字符串进行...
  • 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有该整数。 代码 ...
  • 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有该整数。 示例: ...
  • 首先我们来mock两个对象数组: previousList = [ { dbtime: "02", e: 100, kk: 200 },{ dbtime: "05", e: 20, kk: 100 }],currentList = [{ dbtime: "02", e: 50, kk: 600 },{ dbtime: "05", e: ...
  • 数组A中元素,一个个和数组B元素进行对比 ,如果有相同的值则将数组B中的元素置为空串 最后,将含空的元素 去掉, (出去一样的元素【不保留一样的元素】,改为去空处理) $a = array('128','125'); //传...
  • 编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: ...
  • 1.题目 ... 2.分析 两次二分查找过程,分别找最小下标和最大下标。 3.代码 class Solution { public int[] searchRange(int[] nums, int target) { int[] res=new int[]{-1,-1}; if(nums==nu
  • js 双for循环嵌套,找到arr2 中 group 和 id 与 arr1 中属性值都相同的数据, 添加到新数组 let arr1 = [{group: 1, id: 2, name: "aa"}, {group: 2, id: 1, name: "bb"}, {group: 2, id: 2, name: "cc"}, {group:...
  • 集合与数组对比

    千次阅读 2018-07-09 22:21:23
    相同点:都是数据的容器,一个在数组或集合中可以储存多个数据。不同点:1.元素:数组中的元素只能是相同;集合中的元素是任意的(泛型) 数组中可以存储基本类型和引用类型,集合只能存储引用类型2.长度(元素个数)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,193
精华内容 20,477
关键字:

数组对比查找是否有相同