Javascript 避免在数组上多次循环以重新排列元素

Javascript 避免在数组上多次循环以重新排列元素,javascript,Javascript,我遇到的情况是,我必须根据某些属性值重新排列对象数组,但我正在努力避免在数组上多次循环 // first move the labels to the front entry.response.forEach( (resp, idx) => { if (resp.metadata.response_label && resp.metadata.response_label !== '') { rearrangeAr

我遇到的情况是,我必须根据某些属性值重新排列对象数组,但我正在努力避免在数组上多次循环

      // 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);
        }
      });
首先,如果响应枚举存在,我需要将它们移动到数组的前面。如果存在标签,则需要将其移到数组的前面,但移到枚举类型之后。
releaseArray
函数也基本上在数组上循环,因此此代码效率非常低

是否有任何模式或lodash函数可以帮助优化此过程


更新:my
RebeatArray
函数先获取数组,然后获取旧索引,然后获取新索引(arr、旧索引、新索引)

这将把数组排序为两个数组,然后将它们连接起来。我不确定你正在用这个数组做什么,所以你必须使用这个例子,而不是最终的解决方案

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)
您可以使用自定义比较。请注意,
sort
不一定是稳定的,因此此解决方案可以更改“enum”的顺序

函数比较值(a,b){
返回值(a>b)?1:(a


您能提供一个示例条目和预期结果吗?啊,很有趣,我想我更喜欢这个,它绝对避免了多个循环的必要性。非常感谢。