25757750
25757750

Reputation: 45

JavaScript recursive operation array

I have an array like this (arr), how do I want to get an array like (arr2)? Where the 'start' and 'end' elements are fixed values。

Original array:

var arr = [
  {form: 'start', to: 'task-1'},
  {form: 'start', to: 'task-4'},
  {form: 'task-1', to: 'task-2'},
  {form: 'task-2', to: 'end'},
  {form: 'task-1', to: 'task-3'}
]
console.log(arr)

Expected array:

var arr2 = [
  {form: 'start', to: 'task-1'},
  {form: 'task-1', to: 'task-2'},
  {form: 'task-2', to: 'end'},
]
console.log(arr2)

Upvotes: 2

Views: 71

Answers (2)

Siva Kondapi Venkata
Siva Kondapi Venkata

Reputation: 11001

Recursively find object and push to result array. Here is sample code.

var arr = [
  {form: 'start', to: 'task-1'},
  {form: 'start', to: 'task-4'},
  {form: 'task-1', to: 'task-2'},
  {form: 'task-2', to: 'end'},
  {form: 'task-1', to: 'task-3'}
]


const getTo = search => arr.find(x => x.form === search).to;

let form = 'start';
let to = '';
const res = [];

while (to !== 'end') {
  to = getTo(form);
  res.push({form, to});
  form = to;
}

console.log(res)

Upvotes: 1

CHANist
CHANist

Reputation: 1402

Here is it.

var arr = [
  {form: 'start', to: 'task-1'},
  {form: 'start', to: 'task-4'},
  {form: 'task-1', to: 'task-2'},
  {form: 'task-2', to: 'end'},
  {form: 'task-1', to: 'task-3'}
]
// console.log(arr);

const obj = arr.reduce((accum, value) => {
    const formId = value.form; 
    const to = value.to; 
    if (!accum[formId]) {
        accum[formId] = to;
    }
    return accum;
}, {});

const arr2 = Object.entries(obj).map(([key, value]) => {
    return {
        form: key, 
        to: value
    }
});
console.log(arr2);

Upvotes: 0

Related Questions