Как отправить данные в дочерний массив во вложенном массиве? - PullRequest
0 голосов
/ 28 января 2019

Попытка построить массив, который выводит данные следующим образом:

  • Здравоохранение- Данные на основе понимания для улучшения здравоохранения- Городская аналитика

  • Транспорт- Городская аналитика

  • Города- Городская аналитика

Я пытался зациклить 'экспертизу' / 'текст', но я не могу заставить их работать вместе, чтобы получить желаемый результат в console.log

Любая помощь будет высоко ценится.

    var items = [{
            "item": {
                "id": 0,
                "sector": 'Data',
                "expertise": ["Healthcare"],
                "text": "Data-driven insights to improve healthcare"
            }
        },
        {
            "item": {
                "id": 1,
                "sector": 'Data',
                "expertise": ["Healthcare", "Transport", "Cities"],
                "text": "Urban Analytics"
            }
        }
    }];

    var array = [];

    for (var i = 0; i < items.length; i++) {

        var arr = [{
            'title': items[i].item.sector,
            'items': []
        }];

        for (var j = 0, b = items[i].item.expertise.length; j < b; j++) {
            if (items[i].item.expertise[j] == expertise) {

                arr[0]['items'].push({
                    'list': items[i].item.text
                });

            }
        }

        array.push(arr);

    }

    console.log(array);

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы должны использовать карту

const array =  items.map(el => ({
    text: el.item.sector,
    items: [...el.item.expertise, {
        list : el.item.text
    }]
});
0 голосов
/ 28 января 2019

Здесь у вас есть другой подход с reduce(), также с использованием destructuring и spread operator

var items = [
  {
    "item": {
      "id": 0,
      "sector": 'Data',
      "expertise": ["Healthcare"],
      "text": "Data-driven insights to improve healthcare"
    }
  },
  {
    "item": {
      "id": 1,
      "sector": 'Data',
      "expertise": ["Healthcare", "Transport", "Cities"],
      "text": "Urban Analytics"
    }  
  }
];

let res = items.reduce((acc, {item: {expertise, text}}) =>
{
     expertise.forEach(x => acc[x] = [...(acc[x] || []), text]);
     return acc;
}, {});


Object.entries(res).forEach(([k, v]) =>
{
    console.log(k + "\n->" + v.join("\n->"));
});
0 голосов
/ 28 января 2019

Я бы начал с создания объекта соответствующей экспертизы и текстовых списков, а затем вывел бы так, как вы хотите.Например:

var items = [{
  "item": {
    "id": 0,
    "sector": 'Data',
    "expertise": ["Healthcare"],
    "text": "Data-driven insights to improve healthcare"
  }
}, {
  "item": {
    "id": 1,
    "sector": 'Data',
    "expertise": ["Healthcare", "Transport", "Cities"],
    "text": "Urban Analytics"
  }
}]
    
const obj = items.reduce((res, { item }) => {
  item.expertise.forEach(e => {
    res[e] = res[e] || []
    if(res[e].indexOf(item.text) < 0){ res[e].push(item.text) }
  })
  return res
}, {})

Object.keys(obj).forEach(k => {
  console.log(k)
  obj[k].forEach(text => console.log(`-- ${text}`))
})
...