Javascript 按特定顺序创建新数组

Javascript 按特定顺序创建新数组,javascript,angularjs,Javascript,Angularjs,一旦解决了一个特定的承诺,我希望遍历响应中的每个项,并按特定顺序将它们推送到一个数组中 状态开始 正在进行的状态 状态已完成 我该怎么做呢?以下是我目前的代码: dashService.getBatches(refresh) .then(function (response) { if (response.error) { console.log("No data received"); } else { angular.forEach(response.items, f

一旦解决了一个特定的承诺,我希望遍历响应中的每个项,并按特定顺序将它们推送到一个数组中

  • 状态开始
  • 正在进行的状态
  • 状态已完成
  • 我该怎么做呢?以下是我目前的代码:

    dashService.getBatches(refresh)
    .then(function (response) {
      if (response.error) {
        console.log("No data received");
      } else {
        angular.forEach(response.items, function (item) {
          if (item.status === 'start') {
            currentBatches.push(job);
          }
        });
      }
    });
    

    收到回复后,请执行以下操作:

        dataList = response.items;
        var currentBatches = [];
    
        var statusStartItems = dataList.filter(function(item){ return item.status === 'status-start';});
        //Loop through status-start items and push into currentbatches array
        statusStartItems.each(function(item){
          currentBatches.push(item);
        }
    
        var statusInItems = dataList.filter(function(item){ return item.status === 'status-in';});
        //Loop through status-in items and push into currentbatches array
        statusInItems .each(function(item){
          currentBatches.push(item);
        }
    
    …等等

    这个怎么样

    var newA=dataList.filter(x=>x.status=='status-start').concat(dataList.filter(x=>x.status=='status-in-progress')).concat(dataList.filter(x=>x.status=='status-completed'))
    

    我将创建一个可用选项及其对应顺序的映射,然后根据该映射对要插入的值进行排序。然后在排序后,迭代数组,将它们推送到目标数组中。或者,您可以对它们进行一次排序,以生成一个新数组

    const orderMap = {
      'status-start': 0,
      'status-in-progress': 1,
      'status-completed': 2
    };
    
    newData.sort((a, b) => {
      return orderMap[a] - orderMap[b];
    }).forEach(d => {
      originalData.push(d);
    });
    

    显然,您需要更改对象结构等,这只是一个概念证明。这也是用ES6编写的,所以没有IE,但可以很容易地用ES5编写


    编辑:我看到您的排序基于子属性
    状态
    更新了演示以反映这一点


    作为一个选项,您还可以拥有3个不同的数组,这些数组可以连接成一个结果数组:

    var数据列表=[
    {id:11,状态:'status start'},
    {id:2,状态:'状态已完成'},
    {id:3,状态:'状态正在进行'},
    {id:4,状态:'status start'},
    {id:5,状态:'状态已完成'},
    {id:6,状态:'状态正在进行'},
    {id:7,状态:'status start'},
    {id:8,状态:'status start'},
    {id:9,状态:'状态正在进行'},
    {id:10,状态:'status start'},
    {id:11,状态:'状态已完成'},
    {id:1,状态:“状态已完成”}
    ];
    var currentBatches=[],
    currentStartedBatches=[],
    currentInProgressBatches=[{id:200,状态:'status in progress'}],
    currentCompletedBatches=[{id:12,状态:'status completed'},{id:119,状态:'status completed'}];
    currentStartedBatches=currentStartedBatches.concat(dataList.filter(函数(d){return d.status=='status-start'}));
    currentInProgressBatches=currentInProgressBatches.concat(dataList.filter(函数(d){return d.status==='status-in-progress'}));
    currentCompletedBatches=currentCompletedBatches.concat(dataList.filter(函数(d){return d.status=='status-completed'}));
    currentBatches=currentBatchs.concat(currentStartedBatchs).concat(currentInProgressBatchs).concat(currentCompletedBatchs);
    
    console.log(当前批处理)也许对结果数组进行排序更容易?或者你有更复杂的用例吗?@StanislavKvitash,但是提到的顺序既不是升序也不是降序。如何确保数组按此自定义顺序排序?我不能按特定顺序推送项目,以便阵列本身根据需要重新排列。我不认为这是一个更好的解决方案。这只是给出一个想法/方法。一张地图?
    map
    ?@Crowes我想你指的是这样一个事实:我使用的不是ES6
    map
    ,而是一个简单的对象?如果没有,请详细说明。