避免多次遍历数组以重新排列元素
Avoid looping over array multiple times to rearrange elements
我遇到一种情况,我必须根据某些属性值重新排列对象数组,但我正在努力避免多次循环遍历数组。
// first move the labels to the front
entry.response.forEach( (resp, idx) => {
if (resp.metadata.response_label && resp.metadata.response_label !== '') {
rearrangeArray(entry.response, idx, 0);
}
});
// second move the enums in front of the labels
entry.response.forEach( (resp, idx) => {
if (resp.metadata.response_type === "enum") {
rearrangeArray(entry.response, idx, 0);
}
});
首先,如果响应枚举存在,我需要将它们移动到数组的前面。如果存在标签,则需要将它们移动到数组的前面,但在枚举类型之后。rearrangeArray
函数最终也基本上循环遍历数组,因此此代码效率非常低。
是否有任何模式或 lodash 函数可以帮助优化此过程?
更新:我的rearrangeArray
函数获取数组,然后是旧索引,然后是新索引(arr,old_index,new_index(
这会将数组分类为两个数组,然后连接它们。我不确定你在用 rerangeArray 做什么,所以你会使用这是一个示例而不是最终解决方案。
var labels = [];
var enums = [];
entry.response.forEach( (resp, idx) => {
if (resp.metadata.response_label && resp.metadata.response_label !== '') {
labels.push(resp)
//rearrangeArray(entry.response, idx, 0);
} else if (resp.metadata.response_type === "enum") {
enums.push(resp)
//rearrangeArray(entry.response, idx, 0);
}
});
var results = labels.concat(enums)
您可以将Array.prototype.sort
与自定义比较一起使用。请注意,sort
不一定稳定,因此此解决方案可以更改"enum"的顺序。
function compareValues(a, b) {
return (a > b) ? 1 : (a < b ? -1 : 0);
}
function weighItem(x) {
var meta = x.metadata;
if (meta.response_type === "enum") return 0;
if (meta.response_label) return 1;
return 2;
}
function compareResponses(a, b) {
return compareValues(weighItem(a), weighItem(b));
}
var arr = [
{ metadata: {
response_type: "enum",
response_label: ""
} },
{ metadata: {
response_type: "not_enum",
response_label: ""
} },
{ metadata: {
response_type: "enum",
response_label: "asd"
} },
{ metadata: {
response_type: "not_enum",
response_label: "fgh"
} }
];
arr.sort(compareResponses);
// Log the output
$('pre').text(JSON.stringify(arr, null, 2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>
相关文章:
- 如何删除多行HTML排列中的空白
- 重新排列HTML元素的顺序并更改内容
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- 从数组中删除重复条目,并在javascript中按顺序排列
- 使用CSS从下到上排列元素
- 我可以't在Divs中获得3个twitter小部件,以便并排排列
- Javascript从数组中随机选择并按字母顺序排列
- 如何在php中按元素按字母顺序排列json文件
- Javascript/jQuery:如何从数组的项中获取排列
- 如何在方向更改时重新调整/排列布局(Apache Cordova)
- 有没有比在本例中使用matchMedia更聪明的方法来重新排列页面元素
- 如何根据 js 中每个单词的第 n 个字母按字母顺序排列列表
- 响应式列表,可在浏览器缩小时重新排列
- Javascript将生日按数组顺序排列
- 比较两个JSON数组并重新排列新的JSON数组格式
- 允许用户在HTML页面上重新排列排列的图像
- 阵列排列排列
- Javascript为jquery选择器重新排列数组
- 砌体重新排列,同时仍然调整大小
- 允许用户重新排列 Django 管理站点中的条目,以及如何存储新的自定义顺序以在页面刷新中幸存下来