【问题标题】:How to rearrange the array value using Angular.js/Javascript如何使用 Angular.js/Javascript 重新排列数组值
【发布时间】:2016-05-15 09:41:54
【问题描述】:

我需要使用 Angular.js 或 Javascript 重新排列以下数据数组。

$scope.listOfData=[
             {
         {'date':'2016-01-25 18:14:00','name':'raj','email':'raj@gmail.com','order_status':1,'order_id':1111},
         {'date':'2016-02-04 11:26:05','name':'raj','email':'raj@gmail.com','order_status':0,'order_id':2222}
      },
     {
         {'date':'2016-01-23 13:15:59','name':'rahul','email':'rahul@gmail.com','order_status':1,'order_id':3333},
         {'date':'2016-01-25 18:14:00','name':'rahul','email':'rahul@gmail.com','order_status':0,'order_id':4444}
     }
]

我需要像下面的格式重新排列上面的数据数组。

$scope.array=[
              {'date':'2016-01-25 18:14:00 to 2016-01-25 18:14:00','name':'rahul','email':'rahul@gmail.com','order':[{'order_status':1,'order_id':'1111'},{'order_status':'0','order_id':'2222'} ]},
              {'date':'2016-01-23 13:15:59 to 2016-02-04 11:26:05','name':'raj','email':'raj@gmail.com','order':[{'order_status':1,'order_id':'3333'},{'order_status':'0','order_id':'4444'} ]}
]

请帮我解决这个问题。

【问题讨论】:

  • 请使数据有效。
  • 那么,您的问题是什么? “我需要”不算数。
  • 您按日期范围分组对吗?分组的规则是什么?只给出一个数据集然后再给出另一个是不够的。我们需要知道规则才能将它从一个带到另一个..
  • 我需要将$scope.listOfData 中(0th,1st,....) 的每个索引的所有数据集重新排列为一个,因为某些键值是相同的e.g-name,email,etc..
  • @ste2425 :,是的,你也是对的。

标签: javascript arrays angularjs


【解决方案1】:

您可以使用underscorejs 对数组进行操作。

var listOfData=[
         {'date':'2016-01-25 18:14:00','name':'raj','email':'raj@gmail.com','order_status':1,'order_id':1111},
         {'date':'2016-02-04 11:26:05','name':'raj','email':'raj@gmail.com','order_status':0,'order_id':2222},
         {'date':'2016-01-23 13:15:59','name':'rahul','email':'rahul@gmail.com','order_status':1,'order_id':3333},
         {'date':'2016-01-25 18:14:00','name':'rahul','email':'rahul@gmail.com','order_status':0,'order_id':4444},
];
  
  var grouped = _.chain(listOfData).groupBy(function(each){ return each.name+each.email}).map(function(each){ return {date:_.chain(each).pluck('date').value().join(' to '),name:_.first(each).name,email:_.first(each).email,order:_.chain(each).map(function(e1) { return {order_status:e1.order_status,order_id:e1.order_id} }).value()}}).value();
  
  console.log(grouped)
<script src="http://underscorejs.org/underscore-min.js"></script>

【讨论】:

    【解决方案2】:

    一个带有Array.prototype.forEach()的单循环提案

    forEach() 方法对每个数组元素执行一次提供的函数。

    还有两个用于数据和日期的临时对象。

    var listOfData = [
            { 'date': '2016-01-25 18:14:00', 'name': 'raj', 'email': 'raj@gmail.com', 'order_status': 1, 'order_id': 1111 },
            { 'date': '2016-02-04 11:26:05', 'name': 'raj', 'email': 'raj@gmail.com', 'order_status': 0, 'order_id': 2222 },
            { 'date': '2016-01-23 13:15:59', 'name': 'rahul', 'email': 'rahul@gmail.com', 'order_status': 1, 'order_id': 3333 },
            { 'date': '2016-01-25 18:14:00', 'name': 'rahul', 'email': 'rahul@gmail.com', 'order_status': 0, 'order_id': 4444 }
        ],
        compact = function (data) {
            var object = {},
                date = {},
                array = [];
            data.forEach(function (a) {
                var k = a.name + '|' + a.email;
                date[k] = date[k] || { from: a.date, to: a.date };
                if (a.date < date[k].from) {
                    date[k].from = a.date;
                }
                if (a.date > date[k].to) {
                    date[k].to = a.date;
                }
                if (!object[k]) {
                    object[k] = { date: a.date, name: a.name, email: a.email, order: [] };
                    array.push(object[k]);
                }
                object[k].date = date[k].from + ' to ' + date[k].to;
                object[k].order.push({ order_status: a.order_status, order_id: a.order_id });
            });
            return array;
        }(listOfData);
    
    document.write('<pre>' + JSON.stringify(compact, 0, 4) + '</pre>');

    【讨论】:

    • @ Nina Scholz :很好,但在这里我也需要较低的日期作为日期键和较高的日期作为日期键。
    【解决方案3】:

    你可以试试这样的:

    • 根据nameemail id 对数组进行排序。
    • 根据日期对该数组进行排序。
    • 创建具有必要属性的对象。

    var arr = [{
      'date': '2016-01-25 18:14:00',
      'name': 'raj',
      'email': 'raj@gmail.com',
      'order_status': 1,
      'order_id': 1111
    }, {
      'date': '2016-02-04 11:26:05',
      'name': 'raj',
      'email': 'raj@gmail.com',
      'order_status': 0,
      'order_id': 2222
    }, {
      'date': '2016-01-23 13:15:59',
      'name': 'rahul',
      'email': 'rahul@gmail.com',
      'order_status': 1,
      'order_id': 3333
    }, {
      'date': '2016-01-25 18:14:00',
      'name': 'rahul',
      'email': 'rahul@gmail.com',
      'order_status': 0,
      'order_id': 4444
    }]
    
    arr.sort(function(a, b) {
      if (a.name > b.name) return 1;
      if (a.name < b.name) return -1;
      return 0
    }).sort(function(a, b) {
      return +new Date(a.date) - +new Date(b.date);
    });
    
    var result = {}
    arr.forEach(function(item) {
      if (!result[item.name]) {
        result[item.name] = {};
        result[item.name].orders = [];
      }
    
      if (!result[item.name].startDate)
        result[item.name].startDate = item.date
      else
        result[item.name].endDate = item.date
    
      result[item.name].name = item.name;
      result[item.name].email = item.email;
      result[item.name].orders.push({
        "order_status": item.order_status,
        "order_id": item.order_id,
        "order_date": item.date
      });
    });
    
    console.log(result);
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

    【讨论】:

    • 这段代码不能在这里运行。你能做一个小plunkr例子吗。
    • 你能解释一下吗?我给我输出。注意我使用普通变量而不是$scope
    • @Rajesh:好的,但名字也应该像电子邮件一样。现在它就像钥匙一样。
    • @subhra,我故意忽略了它,因为那是对象内部键的名称。我已经更新了我的答案。
    • @Rajesh :好的,现在它来了,谢谢,但不需要像rahul,raj 这样的密钥。
    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多