避免多次循环遍历数组以重新排列元素

时间:2016-02-16 20:23:32

标签: javascript

我有一种情况,我必须根据某些属性值重新排列对象数组,但我正在努力避免如何多次避免在数组上循环。

      // 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)

2 个答案:

答案 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;
&#13;
&#13;