Как перебрать объект вложенного массива в JavaScript - PullRequest
2 голосов
/ 04 апреля 2019

Я хотел бы знать, как перебирать вложенный массив объектов в Javascipt?У меня есть образец объекта с именем obj.Я хочу получить объект, основываясь на условии 'in' is 'string' и 'out' 'number'.

// tried got stuck
const output = [];
    myList.forEach(entry => {
      Object.keys(entry).forEach(key => {
        const entity = entry[key][0];
        if (entity.in === "string" && entity.out === "number") {
          output.push(entity);
        }
      });
    });
var obj = [{
    "ston": [{
      "id": "identity1",
      "in": "string",
      "out": "number",
      "value": 10
    },{
        "id": "identity2",
        "in": "string",
        "out": "number",
        "value": 10
    }],
    "nton": [{
      "id": "identity1",
      "in": "number",
      "out": "number",
      "value": 20
    },{
      "id": "identity2",
      "in": "number",
      "out": "number",
      "value": 30
    }]
  }]

Ожидаемый результат

   [{
      "id": "identity1",
      "in": "string",
      "out": "number",
      "value": 10
    },{
        "id": "identity2",
        "in": "string",
        "out": "number",
        "value": 10
    }]

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Здесь у вас есть одно решение, которое использует в основном Array.reduce () для перебора внешних объектов массива, получения сплющенного массива значений из каждого внешнего объекта для создания массива с внутренними объектами.а затем отфильтруйте те, которые удовлетворяют условию, сохраняя их в новом массиве:

var obj = [
  {
    "ston": [
      {"id": "identity1", "in": "string", "out": "number", "value": 10},
      {"id": "identity2", "in": "string", "out": "number", "value": 10}
    ],
    "nton": [
      {"id": "identity1", "in": "number", "out": "number", "value": 20},
      {"id": "identity2", "in": "number", "out": "number", "value": 30}
    ]
  }
];

let res = obj.reduce((acc, o) =>
{
    acc = acc.concat(Object.values(o).flat().filter(
        o => o.in === "string" && o.out === "number"
    ));
    return acc;
}, []);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Другая документация используемых методов:

Или, подумав немного, вы можете использовать следующую упрощенную версию с Array.map ()

var obj = [
  {
    "ston": [
      {"id": "identity1", "in": "string", "out": "number", "value": 10},
      {"id": "identity2", "in": "string", "out": "number", "value": 10}
    ],
    "nton": [
      {"id": "identity1", "in": "number", "out": "number", "value": 20},
      {"id": "identity2", "in": "number", "out": "number", "value": 30}
    ]
  }
];

let res = obj.map(Object.values).flat(2).filter(
    o => o.in === "string" && o.out === "number"
);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
1 голос
/ 04 апреля 2019

Вы можете использовать перестроить этот объект во вложенный массив, затем сгладить и, наконец, filter.

var obj = [
  {
    "ston": [
      {"id": "identity1", "in": "string", "out": "number", "value": 10},
      {"id": "identity2", "in": "string", "out": "number", "value": 10}
    ],
    "nton": [
      {"id": "identity1", "in": "number", "out": "number", "value": 20},
      {"id": "identity2", "in": "number", "out": "number", "value": 30}
    ]
  }
];

const tmp = obj.map(e => Object.entries(e).map(([k, v]) => v)).flat(3)

const rs = tmp.filter(e => e.out==='number' && e.in ==='string')

console.log(rs)
1 голос
/ 04 апреля 2019

Простая рекурсивная функция:

var obj = [{
  "ston": [{
    "id": "identity1",
    "in": "string",
    "out": "number",
    "value": 10
  }, {
    "id": "identity2",
    "in": "string",
    "out": "number",
    "value": 10
  }],
  "nton": [{
    "id": "identity1",
    "in": "number",
    "out": "number",
    "value": 20
  }, {
    "id": "identity2",
    "in": "number",
    "out": "number",
    "value": 30
  }]
}];

function getObjects(inVal, outVal) {
  var matches = [];
  obj.forEach(child => {
    Object.values(child).forEach(arr => {
      if (arr.some(e => e.in == inVal && e.out == outVal)) {
        matches.push([...arr.filter(e => e => e.in == inVal && e.out == outVal)]);
      }
    });
  });
  return matches.flat();
}

console.log(getObjects("string", "number"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...