Я хочу отфильтровать массив объектов, который выглядит следующим образом

{
  "value_1": [
    {
      "ts": "2016-12-05T11:28:49+00:00",
      "value": 1
    },
    {
      "ts": "2016-12-05T11:28:55+00:00",
      "value": 1
    }
  ],
  "value_2": [
    {
      "ts": "2016-12-05T11:28:49+00:00",
      "value": 56.1
    },
    {
      "ts": "2016-12-05T11:28:55+00:00",
      "value": 56.08
    }
  ]
}

Для value и вернуть все для value, которое должно отображаться: [1, 1, 56.1, 56.08]

Какой лучший способ сделать это?

-1
edamerau 8 Дек 2016 в 13:08

3 ответа

Лучший ответ

Просто карта, реду-фу

let obj = {
    "value_1": [{"ts": "2016-12-05T11:28:49+00:00", "value": 1},
        {"ts": "2016-12-05T11:28:55+00:00", "value": 1}],
    "value_2": [{"ts": "2016-12-05T11:28:49+00:00", "value": 56.1},
        {"ts": "2016-12-05T11:28:55+00:00", "value": 56.08}]
};

let result = Object.keys(obj).map(key => obj[key].map(ts => ts.value)).reduce((acc, value) => acc.concat(value),[]);

console.log(result);
console.log('isArray = '+Array.isArray(result));
result.forEach((item, index) => console.log(`result[${index}]=${item}`));
2
Bhabishya Kumar 9 Дек 2016 в 06:28

Вам понадобится функция синтаксического анализа, которая будет рекурсивно повторять ваш объект данных.

Что-то вроде этого:

parseObject(obj: any): number[] {
  const _parse = (obj: any): number[] {
    if (!obj || typeof(obj) !== 'object') return [];

    const values = [];
    Object.keys(obj).forEach(k => {
      const o = obj[k];
      if (k === 'value' && !isNaN(o)) values.push(+o);
      if (typeof(o) === 'object') values.push(..._parse(o));
    });

    return values;
  }

  return _parse(obj);
}

Live-демо: https://plnkr.co/edit/c4A0G6zGTa39kQNXyfh??/?p? >

1
mxii 8 Дек 2016 в 10:23

С помощью for-each также вы можете выполнить ваши требования, посмотрите ниже фрагмент

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{final}}!</p>
  </body>
<script>
  var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = {
  "value_1": [
    {
      "ts": "2016-12-05T11:28:49+00:00",
      "value": 1
    },
    {
      "ts": "2016-12-05T11:28:55+00:00",
      "value": 1
    }
  ],
  "value_2": [
    {
      "ts": "2016-12-05T11:28:49+00:00",
      "value": 56.1
    },
    {
      "ts": "2016-12-05T11:28:55+00:00",
      "value": 56.08
    }
  ]
};
 $scope.final=[];
angular.forEach($scope.name,function(k,v){
 
 angular.forEach(k,function(x,y){
  $scope.final.push(x.value);
});
});
console.log($scope.final);

  
});

</script>
</html>
1
Sa E Chowdary 8 Дек 2016 в 10:29