我有一种情况,我必须根据某些属性值重新排列对象数组,但我正在努力避免如何多次避免在数组上循环。
// 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)
答案 0 :(得分:1)
这会将数组排序为两个数组然后加入它们。我不确定你使用rearrangeArray做了什么,所以你将使用这个例子而不是最终的解决方案。
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)
答案 1 :(得分:1)
您可以使用Array.prototype.sort
进行自定义比较。请注意,sort
不一定稳定,因此此解决方案可以更改“枚举”的顺序。
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));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>
&#13;