javascript – 在数组A之后对数组B进行排序,使得引用和相等的基元保持精确的位置
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 在数组A之后对数组B进行排序,使得引用和相等的基元保持精确的位置,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4259字,纯文字阅读大概需要7分钟。
内容图文
![javascript – 在数组A之后对数组B进行排序,使得引用和相等的基元保持精确的位置](/upload/InfoBanner/zyjiaocheng/793/f02bfacca5a9417591e582be4c9ae6db.jpg)
更新2
我在sort函数中添加了一个权重查找,它将性能提高了大约100%以及稳定性,因为之前的sort函数没有考虑所有类型,并且1 ==“1”结果取决于初始值正如@Esailija指出的那样,数组的顺序.
这个问题的目的是改进我的这个Answer,我喜欢这个问题,因为它被接受了,我觉得有一些性能可以挤出排序功能.我在这里问了这个问题,因为我没有太多的线索可以从哪里开始.
也许这会使事情变得更加清晰
更新
我改写了完整的问题,因为很多人都说我不够具体,我尽力说明我的意思.此外,我重写了sort函数以更好地表达问题的意图.
>让arrayPrev为数组(A),其中A由0到n个元素组成(E)
>让元素成为
>原始类型
> boolean,string,number,undefined,null
> a对象O的引用,其中O.type = [object Object]和O可以包含
> 0到n属性P,其中P定义为Element plus
>循环引用O中的任何P
>任何O可以包含1至n次.在GetReferencedName(E1)意义上=== GetReferencedName(E2)…
> a对O的引用,其中O.type = [object Array],O定义为A
>循环引用A中的任何E
>让arrayCurr成为与arrayPrev长度相同的数组
以下示例说明
var x = {
a:"A Property",
x:"24th Property",
obj: {
a: "A Property"
},
prim : 1,
}
x.obj.circ = x;
var y = {
a:"A Property",
x:"24th Property",
obj: {
a: "A Property"
},
prim : 1,
}
y.obj.circ = y;
var z = {};
var a = [x,x,x,null,undefined,1,y,"2",x,z]
var b = [z,x,x,y,undefined,1,null,"2",x,x]
console.log (sort(a),sort(b,a))
问题是,如何有效地对数组B进行排序,使得任何对象的引用或基元的值与先前相同的位置,通过相同的compareFunction,sort,Array A共享.
像上面的例子一样
结果阵列应符合规则.
>让arrayPrev包含a的Elements’和arrayCurr包含b的Elements’
>让arrayPrev按CompareFunction C排序.
>让arrayCurr按相同的C排序.
>让arrayCur排序的结果是这样的,当在位置n访问arrayCur中的E时,让n例如为5
>如果E的类型是Object GetReferencedName(arrayCurr [n])=== GetReferencedName(arrayPrev [n])
>如果E的类型是原始GetValue(arrayCurr [n])=== GetValue(arrayPrev [n])
>即b [n] === a [n]例如b [5] === a [5]
>含义所有元素应按类型分组,并按此值排序.
>如果对C中的功能F的任何调用至少应在ES5之前执行,那么在不需要任何垫片的情况下给出兼容性.
我目前的方法是在arrayPrev中标记对象以在arrayCurr中相应地对它们进行排序,然后再次删除标记.但这似乎并不那么有效.
下面是当前使用的排序函数.
function sort3 (curr,prev) {
var weight = {
"[object Undefined]":6,
"[object Object]":5,
"[object Null]":4,
"[object String]":3,
"[object Number]":2,
"[object Boolean]":1
}
if (prev) { //mark the objects
for (var i = prev.length,j,t;i>0;i--) {
t = typeof (j = prev[i]);
if (j != null && t === "object") {
j._pos = i;
} else if (t !== "object" && t != "undefined" ) break;
}
}
curr.sort (sorter);
if (prev) {
for (var k = prev.length,l,t;k>0;k--) {
t = typeof (l = prev[k]);
if (t === "object" && l != null) {
delete l._pos;
} else if (t !== "object" && t != "undefined" ) break;
}
}
return curr;
function sorter (a,b) {
var tStr = Object.prototype.toString
var types = [tStr.call(a),tStr.call(b)]
var ret = [0,0];
if (types[0] === types[1] && types[0] === "[object Object]") {
if (prev) return a._pos - b._pos
else {
return a === b ? 0 : 1;
}
} else if (types [0] !== types [1]){
return weight[types[0]] - weight[types[1]]
}
return a>b?1:a<b?-1:0;
}
}
继续Fiddle以及JSPerf(随意添加你的片段)
和老Fiddle
解决方法:
如果您知道数组包含相同的元素(具有相同的重复次数,可能以不同的顺序),那么您可以将旧数组复制到新数组中,如下所示:
function strangeSort(curr, prev) {
curr.length = 0; // delete the contents of curr
curr.push.apply(curr, prev); // append the contents of prev to curr
}
如果您不知道数组包含相同的元素,那么按照您的要求进行操作是没有意义的.
根据您链接的内容判断,您可能正在尝试确定数组是否包含相同的元素.在这种情况下,您提出的问题不是您要问的问题,而基于排序的方法可能根本不是您想要的.相反,我建议使用基于计数的算法.
>比较阵列的长度.如果它们不同,则数组不包含相同的元素;返回false.如果长度相等,继续.
>迭代第一个数组,并将每个元素与您看到它的次数相关联.现在ES6 Maps存在,Map可能是跟踪计数的最佳方式.如果不使用Map,则可能需要或方便地以不同方式维护不同数据类型的项目的计数. (如果通过为对象提供新属性来维护对象的计数,请在返回之前删除新属性.)
>迭代第二个数组.对于每个元素,
>如果没有为元素记录计数,则返回false.
>如果元素的计数为正,则将其减1.
>如果元素的计数为0,则元素在第二个数组中出现的次数多于第一个数组中出现的次数.返回false.
>回归真实.
如果到达步骤4,则每个项目在第一个阵列中出现的次数与在第二个阵列中出现的次数相同.否则,它将在步骤3.1或3.3中检测到.如果任何项目在第一个数组中出现的次数多于第二个数组,则第一个数组会更大,并且算法将在步骤1中返回.因此,数组必须包含具有相同重复次数的相同元素.
内容总结
以上是互联网集市为您收集整理的javascript – 在数组A之后对数组B进行排序,使得引用和相等的基元保持精确的位置全部内容,希望文章能够帮你解决javascript – 在数组A之后对数组B进行排序,使得引用和相等的基元保持精确的位置所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。