在AngularJS中排序并创建新数组

时间:2017-03-08 03:14:41

标签: javascript angularjs json

我希望我的解释是正确的。我有一个包含对象的数组:

$scope.items1 = [
  [
    {         
      "answer": "BARCELONA",
      "idcustomer": 6,
      "order": 1.1
    },
    {
      "answer": "REAL MADRID",
      "idcustomer": 6,
      "order": 1.4
    },
    {
      "answer": "LYON",
      "idcustomer": 6,
      "order": 1.2
    },
    {
      "answer": "BAYERN",
      "idcustomer": 6,
      "order": 1.3
    }
  ],
  [
    {
      "answer": "BENFICA",
      "idcustomer": 7,
      "order": 1.2
    },
    {
      "answer": "ARSENAL",
      "idcustomer": 7,
      "order": 1.4
    },
    {
      "answer": "CITY",
      "idcustomer": 7,
      "order": 1.1
    },
    {
      "answer": "UNITED",
      "idcustomer": 7,
      "order": 1.3
    }
  ]
];

我需要创建一个包含此数组值的新数组。

我需要的最终结果是: - 第一个位置是 idcostumer 。 - 按订单排序。 - 具有回答属性的答案。

$scope.result = [

    [6, "BARCELONA", "LYON", "BAYERN", "REAL MADRID"],
    [7, "CITY", "BENFICA", "UNITED", "ARSENAL"]

];

enter image description here

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:1)

听起来你可以使用the reduce methodreduce允许您遍历数组以累积值。

任何一种结构都应该可以正常工作,显然它只会影响你编写方法的方式来转换你想要的数据。我会为你做第一件事:

$scope.result = $scope.items1.map(function(answerData){
    answerData = answerData.sort(function(a, b) {
        return a.order < b.order ? -1 : 1
    });
    return answerData.reduce(function(result, value) {
        result.push(value.answer);
        return result;
    }, [answerData[0].idcustomer]);
});

让我们打破这个。我们使用map迭代您的$scope.items1数组,并为数组中的每个值返回一些内容。由于$scope.items1是数组(或2D数组)的数组,因此每个answerData值本身就是一个数组。首先,我们按answerDataorder数组进行排序。然后,我们在每个reduce数组上使用answerData来获取仅包含idcustomer和每个answer字段的数组。 reduce采用回调函数和初始值。在这种情况下,初始值为[answerData[0].idcustomer]。请注意,如果answerData为空,这将会中断!我们为回调函数resultvalue定义了两个参数。 result是前面每次迭代的总累计结果,value是数组的当前元素。对于每个value,我们只需将其answer字段推送到result数组,然后返回更新后的数组。

从第一个idcustomer元素中取出answerData字段有点奇怪,因此您的第二个数据结构实际上可能会更好。但是,我会告诉你如何做到这一点!

编辑:由于您编辑的问题仅包含其他结构,因此这是您需要的转换:

$scope.result = $scope.items.map(function(answerData) {
    var sortedDescription = answerData.description.sort(function(a,b) {
        return a.order < b.order ? -1 : 1;
    });
    return sortedDescription.reduce(function(result, value) {
        result.push(value.answer);
        return result;
    }, [answerData.idcustomer]);
});