Сравнение объектов вложенного массива с другим массивом элементов и создание нового массива с использованием Javascript или ES6 - PullRequest
0 голосов
/ 09 октября 2019

У меня есть сложный массив, как показано ниже

sectionDetail = [{id: 1, name:'ma'}, {id: 2, name:'na'}, {id: 3, name:'ra'}, {id: 4, name:'ka'}, {id: 5, name:'pa'}];

abc = [{id:'1', name:'zam', sections:['1',4]}, {id:'2', name:'dam', sections:['3']}, {id:'3', name:'nam', sections:['2','4']}];

Теперь мне нужно пройтись по abc по разделам, чтобы заменить элементы массива соответствующими sectionDetail значениями

Я пытался зациклить его на новой переменной, но мои разделы меняются каждый раз. ниже приведен код, который я попробовал.

const matchingBoost = [];
const getCategoryBasedBoostList = [];
abc.forEach((item, i) => {
    sectionDetail.forEach((val, index) => {
      item.section.forEach((value, x) => {
        if (value == val.Id) {
          matchingBoost.push(val);
        }
      });
    });
    getCategoryBasedBoostList.push({
      Name: item.Name,
      Boost: matchingBoost
    });
  });

, поэтому в основном я ищу новый массив, похожий на этот

xyz = [{name:'zam',  sections:[{id: 1, name:'ma'}, {id: 4, name:'ka'}]},
{name:'dam',  sections:[{id: 3, name:'ra'}]}, {name:'nam',  sections:[{id: 2, name:'na'}, {id: 4, name:'ka'}]}];

, надеясь, что у меня есть смысл, и надеясь на какой-то ответ.

Ответы [ 4 ]

2 голосов
/ 09 октября 2019

Вы можете взять Map и затем сопоставить данные с элементами sectionDetail.

var sectionDetail = [{ id: 1, name: 'ma' }, { id: 2, name: 'na' }, { id: 3, name: 'ra' }, { id: 4, name: 'ka' }, { id: 5, name: 'pa' }],
    data = [{ id: '1', name: 'zam', sections: ['1', 4] }, { id: '2', name: 'dam', sections: ['3'] }, { id: '3', name: 'nam', sections: ['2', '4'] }],
    map = new Map(sectionDetail.map(o => [o.id, o])),
    result = data.map(({ name, sections }) =>
        ({ name, sections: sections.map(id => map.get(+id)) })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 09 октября 2019

Вы можете в основном фильтровать секции из sectionDetail в зависимости от того, включено ли object.id внутри него в sections из abc. Я сопоставил индексы с числом в обоих случаях, так как один был строкой, а другой целочисленным.

sectionDetail = [{id: 1, name:'ma'}, {id: 2, name:'na'}, {id: 3, name:'ra'}, {id: 4, name:'ka'}, {id: 5, name:'pa'}];

abc = [{id:'1', name:'zam', sections:['1',4]}, {id:'2', name:'dam', sections:['3']}, {id:'3', name:'nam', sections:['2','4']}];

xyz = abc.map(item => ({...item, sections: sectionDetail.filter(sect => item.sections.map(id => parseInt(id)).includes(parseInt(sect.id)))}));

console.log(xyz);
0 голосов
/ 09 октября 2019

Попробуйте так:

const sectionDetail = [
    { id: 1, name: 'ma' },
    { id: 2, name: 'na' },
    { id: 3, name: 'ra' },
    { id: 4, name: 'ka' },
    { id: 5, name: 'pa' }];

const abc = [
    { id: '1', name: 'zam', sections: ['1', 4] },
    { id: '2', name: 'dam', sections: ['3'] },
    { id: '3', name: 'nam', sections: ['2', '4'] }
];

const desired = abc.map(({id, name, sections}) => {
    return {id, name, sections : sectionDetail.filter(f => {
        return sections.map(s => +s).includes(f.id)
    })};

})

console.log(desired);

, где +s приведен к типу Number.

0 голосов
/ 09 октября 2019

То есть вы хотите удалить id из объектов abc и заменить элементы массива section соответствующими объектами details? Это похоже на работу forEach и карту! Код, который я собираюсь показать, также выполняет небольшую предварительную обработку массива разделов, чтобы сделать весь код более эффективным.

const sections = sectionDetail.reduce((result, section) => {
    result[section.id] = section;
    return result;
}, {});
abc.forEach(item => {
    delete item.id;
    item.sections = item.sections.map(id => sections[id]);
});
...