2016-07-05 57 views
0

下面合并重复到一个数组

[ 
{"st":"10:30,22:30","day":1}, 
{"st":"9:30,20:30","day":3}, 
{"st":"9:30,20:30","day":4}, 
{"st":"11:0,23:30","day":7}, 
{"st":"11:0,23:30","day":6}, 
{"st":"8:0,23:0","day":2}, 
{"st":"8:0,23:0","day":5} 
] 

我想把它转换成类似下面

[ 
{"st":"10:30,22:30","day":[1]}, 
{"st":"9:30,20:30","day":[3,4]}, 
{"st":"11:0,23:30","day":[7,6]}, 
{"st":"8:0,23:0","day":[2,5]} 
] 

基于重复的“ST”的价值观我有一个数组,我想合并这些相应的天。 我被尝试了很多方法,但我无法做到。任何人都可以帮助我。提前致谢。

+0

你能举一些你已经尝试过的例子吗? – gcampbell

回答

2

一种方法如下:

var yourArray = [ 
 
{"st":"10:30,22:30","day":1}, 
 
{"st":"9:30,20:30","day":3}, 
 
{"st":"9:30,20:30","day":4}, 
 
{"st":"11:0,23:30","day":7}, 
 
{"st":"11:0,23:30","day":6}, 
 
{"st":"8:0,23:0","day":2}, 
 
{"st":"8:0,23:0","day":5} 
 
]; 
 

 
var newArray = 
 
Array.from(new Set(yourArray.map(elem => elem.st))) // get unique st's 
 
    .map(elem => ({ 
 
     st: elem, 
 
     day: yourArray.filter(el => el.st === elem).map(el => el.day) // get array of days 
 
})); 
 

 
console.log(newArray);

注意,这里使用ES6的功能,你需要使用transpiler(例如巴贝尔)非ES6兼容的浏览器来使用它。

资源

1

这个基本代码可能会有所帮助。

angular.module('MyApp', []) 
 
    .controller('TestCtrl', function($scope) { 
 
    $scope.originalArray = [{ 
 
     "st": "10:30,22:30", 
 
     "day": 1 
 
    }, { 
 
     "st": "9:30,20:30", 
 
     "day": 3 
 
    }, { 
 
     "st": "9:30,20:30", 
 
     "day": 4 
 
    }, { 
 
     "st": "11:0,23:30", 
 
     "day": 7 
 
    }, { 
 
     "st": "11:0,23:30", 
 
     "day": 6 
 
    }, { 
 
     "st": "8:0,23:0", 
 
     "day": 2 
 
    }, { 
 
     "st": "8:0,23:0", 
 
     "day": 5 
 
    }]; 
 
    $scope.result = []; 
 

 
    (function() { 
 
     angular.forEach($scope.originalArray, function(value) { 
 
     var locateIndex = _.findIndex($scope.result, { 
 
      'st': value.st 
 
     }); 
 
     if (locateIndex === -1) { 
 
      var currentDayValue = value.day; 
 
      value.day = [currentDayValue]; 
 
      $scope.result.push(value); 
 
      return; 
 
     } 
 

 
     $scope.result[locateIndex].day.push(value.day); 
 
     }); 
 
    }).call() 
 
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="MyApp" ng-controller="TestCtrl"> 
 
    original array 
 
    <div>{{ originalArray }}</div> 
 
    <br/>result 
 
    <div>{{ result }}</div> 
 
</div>

PS:我用lodash为JS工具库。 (findIndex辅助功能)

+0

完美地为我的场景工作。非常感谢 – user2451830

0

创建临时阵列进行检查重复st值由indexOf。检查st值温度存在,如果没有你的日子值更改为数组类型。如果存在推一天上一索引和splice

删除后
var object = [ 
{"st":"10:30,22:30","day":1}, 
{"st":"9:30,20:30","day":3}, 
{"st":"9:30,20:30","day":4}, 
{"st":"11:0,23:30","day":7}, 
{"st":"11:0,23:30","day":6}, 
{"st":"8:0,23:0","day":2}, 
{"st":"8:0,23:0","day":5} 
]; 
var temp = []; 
for(var i = object.length-1;i > 0;i--){ 
    if(temp.indexOf(object[i].st) != -1){ 
      var exist = temp.indexOf(object[i].st); 
      object[exist].day.push(object[i].day); 
      object.splice(i,1); 
    } 
    else{ 
     temp[i] = object[i].st; 
     var d = object[i].day; 
     object[i].day = []; 
     object[i].day.push(d); 
    } 
} 
console.log(object); 
相关问题