Поиск элементов в объекте javascript, состоящем из сложных вложенных массивов - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно найти элементы в объекте javascript, которые находятся в различных массивах. Массивы находятся во вложенном объекте javascript. Я реализовал способ получения нужных мне данных, но он кажется очень длинным с 4 вложенными циклами.

Я понимаю, что мог бы использовать цикл for для перебора элементов, но это не самый красивый способ. Я разобрался, как использовать функцию фильтра для доступа к интересующим меня элементам верхнего уровня, но изо всех сил пытался выяснить, как фильтровать внутренние элементы.

В моем коде ниже, интересно, строки заполняются соответствующим образом. Следующим этапом является создание списка всех элементов с измерением.value.label «fw», а затем печать чисел измерения. Как я могу это сделать?

// lines crossed that we are interested in
let interest = ["Entry", "Exit"];

let lines = {"element":[{"element-id":2,"element-name":"line_2.1","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":0,"label":"fw"},{"value":0,"label":"bw"}]}]},{"element-id":3,"element-name":"line_2.2","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":1,"label":"fw"},{"value":0,"label":"bw"}]}]},{"element-id":1,"element-name":"Entry","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":1,"label":"fw"},{"value":0,"label":"bw"}]}]},{"element-id":0,"element-name":"Exit","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":0,"label":"fw"},{"value":0,"label":"bw"}]}]},{"element-id":4,"element-name":"line_2.3","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":0,"label":"fw"},{"value":0,"label":"bw"}]}]},{"element-id":5,"element-name":"line_2.4","sensor-type":"MULTI_SENSOR","data-type":"LINE","from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","resolution":"ONE_MINUTE","measurement":[{"from":"2018-05-08T08:59:00Z","to":"2018-05-08T09:00:00Z","value":[{"value":0,"label":"fw"},{"value":0,"label":"bw"}]}]}]};


console.log(`lines in collection=${lines.element.length}`);  // 6

// filter function on line name
function required_line(item) {
    for(var i = 0; i < interest.length; ++i) {
        if (item["element-name"] == interest[i]) {
            return true;
    }
    }
    return false;
}

const interesting_lines = lines.element.filter(required_line);
console.log(`result of filter: ${JSON.stringify(interesting_lines)} `);

// filter out by label - eg fwd???
var morefiltered=interesting_lines.filter( function(element) { return element["measurement"]["value"]["label"] == "fw"; });
// above line fails - TypeError: Cannot read property 'label' of undefined

console.log(`2nd level filter: ${JSON.stringify(morefiltered)} `);

Мой предполагаемый результат будет:

forward line crossing numbers:
line name: Entry, value: 1
line name: Exit, value: 0

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Структура данных невелика, поэтому, если вы можете это изменить, я бы порекомендовал это, что, в свою очередь, упростило бы ваш алгоритм.

Я пытался решить проблему для вас с помощью underscoreJS, но я не совсем уверен, что это то, что вы хотите.

var myObjects = _.filter(lines.element, function(l){
  return _.any(interest, function(i){
    return l["element-name"] == i;
  });
});
0 голосов
/ 08 мая 2018

, поскольку measurement и value являются массивами, вам придется итерировать по ним,

const morefiltered=interesting_lines.filter( element => { 
    return element.measurement.filter(a => {
        return a.value.filter(b => {
            return b.label == "fw";
        })
    })
});

и создайте пустой массив и заполните его соответствующими значениями:

// lines crossed that we are interested in
let interest = ["Entry", "Exit"];

let lines = {
  "element": [{
    "element-id": 2,
    "element-name": "line_2.1",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 0,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }, {
    "element-id": 3,
    "element-name": "line_2.2",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 1,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }, {
    "element-id": 1,
    "element-name": "Entry",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 1,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }, {
    "element-id": 0,
    "element-name": "Exit",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 0,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }, {
    "element-id": 4,
    "element-name": "line_2.3",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 0,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }, {
    "element-id": 5,
    "element-name": "line_2.4",
    "sensor-type": "MULTI_SENSOR",
    "data-type": "LINE",
    "from": "2018-05-08T08:59:00Z",
    "to": "2018-05-08T09:00:00Z",
    "resolution": "ONE_MINUTE",
    "measurement": [{
      "from": "2018-05-08T08:59:00Z",
      "to": "2018-05-08T09:00:00Z",
      "value": [{
        "value": 0,
        "label": "fw"
      }, {
        "value": 0,
        "label": "bw"
      }]
    }]
  }]
};


// console.log(`lines in collection=${lines.element.length}`);  // 6

// filter function on line name
function required_line(item) {
  for (var i = 0; i < interest.length; ++i) {
    if (item["element-name"] == interest[i]) {
      return true;
    }
  }
  return false;
}

const interesting_lines = lines.element.filter(required_line);
//console.log(`result of filter: ${JSON.stringify(interesting_lines)} `);
let values = [];
// filter out by label - eg fwd >>>
const morefiltered = interesting_lines.filter(element => {
  return element.measurement.filter(a => {
    return a.value.filter(b => {
      if(b.label == "fw"){
        values.push({name : element["element-name"], value : b.value});
        return true;
      }
    })
  })
});

console.log('values : ', JSON.stringify(values))
console.log(`2nd level filter: ${JSON.stringify(morefiltered)} `);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...