JavaScript实现在数组中查找不同顺序排列的字符串


Posted in Javascript onSeptember 26, 2014

需求描述:从一组数组中找出一组按不同顺序排列的字符串的数组元素。假如有这样一个数组:

[ 'abcd', 'hello', 'bdca', 'olleh', 'cadb', 'nba', 'abn', 'abc' ]

需要找出的结果是:

[ 'abcd', 'bdca', 'cadb' ]

那么这里的关键点是判断一组字符串是否是否只是字符的顺序不同,只要解决整个关键点其他都好办了。

方法1:

var stringClassify = function( arr ){

    var arrLength = arr.length,

        obj = {},

        i = 0,

        num, item, name, firstItem, strLength;

 

    for( ; i < arrLength; i++ ){

        item = arr[i];

        strLength = item.length;

        num = 0;

 

        // 将单个的字符转换成 Unicode 编码

        // 对编码进行取和计算

        for( j = 0; j < strLength; j++ ){

            num += item.charCodeAt( j );

        }      

 

        if( !firstItem ){

            firstItem = item;

            obj[ num ].push( item );

        }

                // 通过检测待添加的字符串的第一个字符是否

                // 在另一个字符串中出现以避免将下面的情况

                // [ 'ad', 'da', 'bc' ]

        else if( ~firstItem.indexOf(item.charAt(0)) ){

            obj[ num ].push( item );

        }

    }

 

    for( name in obj ){

        console.log( obj[name] );

    }

};

方法1采用了遍历字符串中的每一个字符,然后将单个的字符转换成 Unicode 编码,对编码进行取和的计算,abcd 和 bdca 的编码和会是一致的。最后用编码和作为对象的 key 来保存编码和一致的字符串。

方法 1 需要注意的是,字符串“ad”和“bc”的 Unicode 编码和是一样的,此时需要多加一个判断,检测任意一个字符串中的第一个字符是否有出现在另一个字符串中出现过即可。

方法2:

var stringClassify = function(){

    var arrLength = arr.length,

        obj = {},

        i = 0,

        num, item, name, strArr, newStr;

 

    for( ; i < arrLength; i++ ){

        item = arr[i];

 

        strArr = arr[i].split( '' );

        strArr.sort();

        newStr = strArr.join( '' );

 

        if( !obj[newStr] ){

            obj[ newStr ] = [];

        }

 

        obj[ newStr ].push( item );

    }

 

    for( name in obj ){

        console.log( obj[name] );

    }

};

方法2是将字符串转换成数组后再对数组进行 sort 排序,abcd 和 bdca 使用 sort 排序后会变成 abcd,将拍好序的字符串作为对象的 key 来保存排序一致的字符串。

其实两种方法的原理都是通过将字符转换成 Unicode 编码,只是方法1是显式的转换,而方法2中用到的 sort 排序,会隐式的转换。

Javascript 相关文章推荐
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
Jquery动态进行图片缩略的原理及实现
Aug 13 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
开启BootStrap学习之旅
May 04 Javascript
jQuery插件ajaxFileUpload异步上传文件
Oct 19 Javascript
JavaScript中清空数组的方法总结
Dec 02 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
Jul 31 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
jquery插件实现图片悬浮
Apr 16 jQuery
前端轻量级MVC框架CanJS详解
Sep 26 #Javascript
alert出数组中的随即值代码
Sep 25 #Javascript
jquery得到iframe src属性值的方法
Sep 25 #Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 #Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 #Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
Sep 25 #Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
Sep 25 #Javascript
You might like
php $_SERVER当前完整url的写法
2009/11/12 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
推荐dojo学习笔记
2007/03/24 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jQuery操作cookie
2016/08/08 Javascript
Angular工具方法学习
2016/12/26 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python迭代器与生成器基本用法分析
2018/07/26 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
详解python对象之间的交互
2020/09/29 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
实习生自荐信范文
2013/11/13 职场文书
《称象》教学反思
2014/04/25 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
争先创优个人总结
2015/03/04 职场文书
李强优秀员工观后感
2015/06/16 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang