У меня есть этот массив сделки:
const transactions = [
{
service: 'Some Text Assignment #1',
phase: 'Assignment'
},
{
service: 'Some Text Processing #1',
phase: 'Processing'
},
{
service: 'Some Text Processing #2',
phase: 'Processing'
},
{
service: 'Some Text Issue Constancy #1',
phase: 'Issue Constancy'
},
{
service: 'Some Text Quality Control #1',
phase: 'Quality Control'
},
{
service: 'Some Text Signature and stamp #1',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #2',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #3',
phase: 'Signature and stamp'
},
{
service: 'Some Text Processing #3',
phase: 'Processing'
},
{
service: 'Some Text Processing #4',
phase: 'Processing'
},
{
service: 'Some Text Signature and stamp #4',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #5',
phase: 'Signature and stamp'
},
{
service: 'Some Text Approved #1',
phase: 'Approved'
}
];
Мне нужно получить значения, сгруппированные по phase, но с определенным условием:
нужен последнее значение из фазы, которые непрерывны в пределах одинаковое значение фазы.
Я хочу получить что-то вроде этого:
[
{
service: 'Some Text Assignment #1',
phase: 'Assignment'
},
{
service: 'Some Text Processing #2',
phase: 'Processing'
},
{
service: 'Some Text Issue Constancy #1',
phase: 'Issue Constancy'
},
{
service: 'Some Text Quality Control #1',
phase: 'Quality Control'
},
{
service: 'Some Text Signature and stamp #3',
phase: 'Signature and stamp'
},
{
service: 'Some Text Processing #4',
phase: 'Processing'
},
{
service: 'Some Text Signature and stamp #5',
phase: 'Signature and stamp'
},
{
service: 'Some Text Approved #1',
phase: 'Approved'
}
]
Я пробовал это:
transactions.reduce((acc, value) => {
acc[value.phase] = value;
return acc;
}, {});
Но я получаю последнее значение каждого phase. Я подумал об использовании Maps или Sets. Некоторые идеи?



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


Вы пытаетесь решить почти правильно, но вы должны проверить последний вставленный объект, а не любой вставленный объект.
const transactions = [
{
service: 'Some Text Assignment #1',
phase: 'Assignment'
},
{
service: 'Some Text Processing #1',
phase: 'Processing'
},
{
service: 'Some Text Processing #2',
phase: 'Processing'
},
{
service: 'Some Text Issue Constancy #1',
phase: 'Issue Constancy'
},
{
service: 'Some Text Quality Control #1',
phase: 'Quality Control'
},
{
service: 'Some Text Signature and stamp #1',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #2',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #3',
phase: 'Signature and stamp'
},
{
service: 'Some Text Processing #3',
phase: 'Processing'
},
{
service: 'Some Text Processing #4',
phase: 'Processing'
},
{
service: 'Some Text Signature and stamp #4',
phase: 'Signature and stamp'
},
{
service: 'Some Text Signature and stamp #5',
phase: 'Signature and stamp'
},
{
service: 'Some Text Approved #1',
phase: 'Approved'
}
];
let out = transactions.reduce((acc, value) => {
let last = acc.length && acc[acc.length - 1];
if (last && last.phase === value.phase)
last.service = value.service;
else
acc.push(value);
return acc;
}, []);
console.info(out);Вы можете проверить соседние значения и добавить, как только увидите несоответствующие фазы.
const transactions = [{"service":"Some Text Assignment #1","phase":"Assignment"},{"service":"Some Text Processing #1","phase":"Processing"},{"service":"Some Text Processing #2","phase":"Processing"},{"service":"Some Text Issue Constancy #1","phase":"Issue Constancy"},{"service":"Some Text Quality Control #1","phase":"Quality Control"},{"service":"Some Text Signature and stamp #1","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #2","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #3","phase":"Signature and stamp"},{"service":"Some Text Processing #3","phase":"Processing"},{"service":"Some Text Processing #4","phase":"Processing"},{"service":"Some Text Signature and stamp #4","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #5","phase":"Signature and stamp"},{"service":"Some Text Approved #1","phase":"Approved"}]
let final = transactions.reduce((op,inp,index)=>{
if ( index + 1 === transactions.length){
if (transactions[index-1].phase !== inp.phase){
op.push(inp)
}
}
else if (transactions[index+1].phase !== inp.phase){
op.push(inp)
}
return op
},[])
console.info(final)Сгруппируйте соседние элементы с помощью Array.reduce(), затем сопоставьте и возьмите последний элемент в каждой группе:
const transactions = [{"service":"Some Text Assignment #1","phase":"Assignment"},{"service":"Some Text Processing #1","phase":"Processing"},{"service":"Some Text Processing #2","phase":"Processing"},{"service":"Some Text Issue Constancy #1","phase":"Issue Constancy"},{"service":"Some Text Quality Control #1","phase":"Quality Control"},{"service":"Some Text Signature and stamp #1","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #2","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #3","phase":"Signature and stamp"},{"service":"Some Text Processing #3","phase":"Processing"},{"service":"Some Text Processing #4","phase":"Processing"},{"service":"Some Text Signature and stamp #4","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #5","phase":"Signature and stamp"},{"service":"Some Text Approved #1","phase":"Approved"}]
const result =
transactions.reduce((r, o, i, arr) => {
if (!i || o.phase !== arr[i - 1].phase) r.push([]);
r[r.length - 1].push(o);
return r;
}, [])
.map(arr => arr[arr.length - 1]);
console.info(result);Используйте Массив.уменьшить следующим образом
const transactions = [{"service":"Some Text Assignment #1","phase":"Assignment"},{"service":"Some Text Processing #1","phase":"Processing"},{"service":"Some Text Processing #2","phase":"Processing"},{"service":"Some Text Issue Constancy #1","phase":"Issue Constancy"},{"service":"Some Text Quality Control #1","phase":"Quality Control"},{"service":"Some Text Signature and stamp #1","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #2","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #3","phase":"Signature and stamp"},{"service":"Some Text Processing #3","phase":"Processing"},{"service":"Some Text Processing #4","phase":"Processing"},{"service":"Some Text Signature and stamp #4","phase":"Signature and stamp"},{"service":"Some Text Signature and stamp #5","phase":"Signature and stamp"},{"service":"Some Text Approved #1","phase":"Approved"}];
let phase;
const result = transactions.reduce((a,c) => {
if (phase && c.phase == phase) a[a.length-1] = c;
else { a.push(c); phase = c.phase;}
return a;
}, []);
console.info(result);Другими словами: вы просто хотите отфильтровать повторяющиеся фазы:
const result = [...transactions]
.reverse()
.filter((el, i, arr) => !i || el.phase !== arr[i - 1].phase)
.reverse();
Вы можете добавить элемент в вывод, если следующий элемент в массиве не имеет того же phase, что и текущий элемент.
const transactions=[{service:"Some Text Assignment #1",phase:"Assignment"},{service:"Some Text Processing #1",phase:"Processing"},{service:"Some Text Processing #2",phase:"Processing"},{service:"Some Text Issue Constancy #1",phase:"Issue Constancy"},{service:"Some Text Quality Control #1",phase:"Quality Control"},{service:"Some Text Signature and stamp #1",phase:"Signature and stamp"},{service:"Some Text Signature and stamp #2",phase:"Signature and stamp"},{service:"Some Text Signature and stamp #3",phase:"Signature and stamp"},{service:"Some Text Processing #3",phase:"Processing"},{service:"Some Text Processing #4",phase:"Processing"},{service:"Some Text Signature and stamp #4",phase:"Signature and stamp"},{service:"Some Text Signature and stamp #5",phase:"Signature and stamp"},{service:"Some Text Approved #1",phase:"Approved"}];
const output = []
transactions.forEach((o, i) => {
const next = transactions[i + 1] || {};
if (next.phase !== o.phase)
output.push(o)
})
console.info(output)
Очень просто и логично!