2017-06-07 93 views
1

解决了特定的承诺后,我希望遍历响应中的每个项目,并按特定顺序将它们推送到数组中。以特定顺序创建新阵列

  1. status-start
  2. status-in-progress
  3. status-completed

我怎么能去这样做?这是我到目前为止的代码:

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); 
     } 
    }); 
    } 
}); 
+1

也许更容易只是排序结果阵列?或者你有更复杂的用例? –

+0

@StanislavKvitash但提到的顺序既不是升序,也不是降序。你将如何确保数组按照这个自定义顺序排序?无法按特定顺序推送项目,以便根据需要重新排列阵列。 – StrugglingCoder

回答

2

这个怎么样

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')) 
1

一旦你得到您的回复,请执行下列操作:

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); 
    } 

..所以在

+0

我不认为这是一个更好的解决方案 –

+0

这只是给出一个想法/方法。 –

0

我会创建可用选项的映射及其相应的顺序,然后根据该映射对您的值进行排序以插入。然后,一旦排序迭代数组推送到您的目标数组。这或者你可以连接他们一旦排序产生一个新的数组。

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); 
}); 

Heres a fiddle

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


编辑:我看到你的排序是基于更新的演示,以反映子属性status

https://jsfiddle.net/k0m2s1yt/2/

+0

地图?一个“地图”? – Crowes

+0

@Crowes我认为你提到的事实即时通讯不使用ES6'地图',而是一个简单的对象?如果不是请详细说明。 – ste2425

0

作为一个选项,你也可以有可能被连接成一个结果,一个3个不同的排列:

var dataList = [ 
 
    {id: 11, status: 'status-start'}, 
 
    {id: 2, status: 'status-completed'}, 
 
    {id: 3, status: 'status-in-progress'}, 
 
    {id: 4, status: 'status-start'}, 
 
    {id: 5, status: 'status-completed'}, 
 
    {id: 6, status: 'status-in-progress'}, 
 
    {id: 7, status: 'status-start'}, 
 
    {id: 8, status: 'status-start'}, 
 
    {id: 9, status: 'status-in-progress'}, 
 
    {id: 10, status: 'status-start'}, 
 
    {id: 11, status: 'status-completed'}, 
 
    {id: 1, status: 'status-completed'} 
 
]; 
 

 
var currentBatches = [], 
 
currentStartedBatches = [], 
 
currentInProgressBatches = [{id: 200, status: 'status-in-progress'}], 
 
currentCompletedBatches = [{id: 12, status: 'status-completed'}, {id: 119, status: 'status-completed'}]; 
 

 
currentStartedBatches = currentStartedBatches.concat(dataList.filter(function(d){ return d.status ==='status-start' })); 
 

 
currentInProgressBatches = currentInProgressBatches.concat(dataList.filter(function(d){ return d.status ==='status-in-progress' })); 
 

 
currentCompletedBatches = currentCompletedBatches.concat(dataList.filter(function(d){ return d.status ==='status-completed' })); 
 

 
currentBatches = currentBatches.concat(currentStartedBatches).concat(currentInProgressBatches).concat(currentCompletedBatches); 
 

 
console.log(currentBatches);