Я хочу отфильтровать массив positions и удалить все позиции, представленные в массиве people.
Я пробовал несколько комбинаций _.forEach и _.filter, но никак не могу понять.
console.info(position)
var test = _.filter(position, function(pos) {
_.forEach(people, function(peo) {
_.forEach(peo.position, function(peoplePos) {
if (peoplePos.value == pos.value){
return false;
}
});
});
});
console.info(test)
Я думаю, что моя главная проблема заключается в том, что позиции вложены внутри каждого объекта людей.
var positions = [{
val: 'CEO',
label: 'CEO XXX'
}, {
val: 'CTO',
label: 'CTO XXX'
}, {
val: 'CBO',
label: 'CBO XXX'
}, {
val: 'CLO',
label: 'CLO XXX'
}]
var people = [{
id: 'AAA',
positions: [{
val: 'CEO',
label: 'CEO XXX'
}]
},{
id: 'BBB',
positions: [{
val: 'CXO',
label: 'CXO XXX'
},{
val: 'CEO',
label: 'CEO XXX'
}]
},{
id: 'CCC',
positions: [{
val: 'CTO',
label: 'CTO XXX'
}]
}]
В этом сценарии я стремлюсь к следующему результату:
var positions = [{
val: 'CBO',
label: 'CBO XXX'
}, {
val: 'CLO',
label: 'CLO XXX'
}]
Поскольку CBO и CLO не представлены никаким объектом в массиве людей.
@ Раджеш, да, извини за это. Одна минута
.map() массив лиц, чтобы извлечь все массивы позиций, затем сгладить (или сгладить, а затем отобразить) результат, чтобы у вас был массив, содержащий все позиции, которые в настоящее время занимает хотя бы один человек. Затем просто .filter() массив позиций с помощью occupied_positions.includes( position ).
Вопрос @Rajesh обновлен. Просто пришлось нажать ctrl + z достаточно далеко до точки, где это имело смысл
@Daft Pointer 1, у вас есть 2 forEach, но вы не возвращаетесь из внешнего forEach
positions не position, а value не val. Обратному вызову filter нужен return, чтобы сделать что-то полезное, а _.forEach просто возвращает исходную коллекцию. Вы проверяли консоль при запуске?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Быстрый способ — преобразовать массив людей в строку и проверить позицию в строке.
Это избавит вас от необходимости зацикливаться на вложенной структуре.
var positions = [{ val: 'CEO', label: 'CEO XXX' }, { val: 'CTO', label: 'CTO XXX' }, { val: 'CBO', label: 'CBO XXX' }, { val: 'CLO', label: 'CLO XXX' }]
var people = [{ id: 'AAA', positions: [{ val: 'CEO', label: 'CEO XXX' }] }, { id: 'BBB', positions: [{ val: 'CXO', label: 'CXO XXX' }, { val: 'CEO',
label: 'CEO XXX' }] }, { id: 'CCC', positions: [{ val: 'CTO', label: 'CTO XXX' }] }];
var stringifiedPeople = JSON.stringify(people)
var newPositions = positions.filter((position) =>
!stringifiedPeople.includes(JSON.stringify(position))
);
console.info(newPositions)Или вы можете создать карту, которая содержит все занятые позиции и отфильтровать доступные позиции.
var positions = [{ val: 'CEO', label: 'CEO XXX' }, { val: 'CTO', label: 'CTO XXX' }, { val: 'CBO', label: 'CBO XXX' }, { val: 'CLO', label: 'CLO XXX' }]
var people = [{ id: 'AAA', positions: [{ val: 'CEO', label: 'CEO XXX' }] }, { id: 'BBB', positions: [{ val: 'CXO', label: 'CXO XXX' }, { val: 'CEO',
label: 'CEO XXX' }] }, { id: 'CCC', positions: [{ val: 'CTO', label: 'CTO XXX' }] }];
var mappedPositions = {}
people.forEach((p) =>
p.positions.forEach((position) =>
mappedPositions[position.val] = true
)
);
var newPositions = positions.filter((position) => !mappedPositions[position.val]);
console.info(newPositions)Картографическое решение отличное, очень ценю помощь. Пробовал нечто подобное, но не вышло. Спасибо еще раз!
Вы можете использовать filter, find и some, чтобы отфильтровать те объекты, которые не отображаются в массиве position массива people.
var positions = [{val:'CEO',label:'CEOXXX'},{val:'CTO',label:'CTOXXX'},{val:'CBO',label:'CBOXXX'},{val:'CLO',label:'CLOXXX'}];
var people = [{id:'AAA',positions:[{val:'CEO',label:'CEOXXX'}]},{id:'BBB',positions:[{val:'CXO',label:'CXOXXX'},{val:'CEO',label:'CEOXXX'}]},{id:'CCC',positions:[{val:'CTO',label:'CTOXXX'}]}];
const out = positions.filter(position => {
return !people.find(person => {
return person.positions.some(({ val, label }) => {
return val === position.val && label === position.label;
});
});
});
console.info(out);Реализация моего комментария.
Все это можно записать в виде большого .reduce() в массиве позиций, чтобы сделать его более эффективным, но я предпочел показать точные шаги, чтобы было более понятно, что делает каждый шаг.
var positions = [{val:'CEO',label:'CEOXXX'},{val:'CTO',label:'CTOXXX'},{val:'CBO',label:'CBOXXX'},{val:'CLO',label:'CLOXXX'}];
var people = [{id:'AAA',positions:[{val:'CEO',label:'CEOXXX'}]},{id:'BBB',positions:[{val:'CXO',label:'CXOXXX'},{val:'CEO',label:'CEOXXX'}]},{id:'CCC',positions:[{val:'CTO',label:'CTOXXX'}]}];
const occupied_positions = people
.map( person => person.positions )
.flat()
.map( position => position.val );
const all_positions = positions
.map( position => position.val );
const open_positions = all_positions
.filter( position => !occupied_positions.includes( position ))
.map( position => positions.find( source => source.val === position ));
console.info( open_positions );Просто указатель, вы должны использовать уменьшенную версию данных. Это позволяет сосредоточиться на вашем коде. Вы можете скопировать его из моего ответа или ответа Энди.
Я использовал этот инструмент, потому что я ленив.
Хорошая точка зрения. :) Поскольку у меня нет горизонтального колеса прокрутки, я ошибочно предположил, что люди ненавидят прокрутку вправо, чтобы иметь возможность читать ввод так же, как и я.
Для пользователя с вашим представителем вы должны знать важность обмена усилиями