0

I have an array in following order

[
  {
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  }
]

I need to sort it in following order

[
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  }
]

So far I have tried below, first sort on base of source,target and value, now I don't know how to sort in second step to get desired out. Any help/suggestion will be appreciated.

var data = [{
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  }
];

data.sort(function(a, b) {
  return a.source - b.source || a.target - b.target || a.value - b.value;
});

console.log(JSON.stringify(data));

UpDate 1
There is a relationship b/w source and target. Sorted array should be in the following sequence

smallest element named "A" based on source, target, value
source = smallest source
target = smallest target
value = smallest value

all the elements who's
source = element A target
target =
Value = element A value
..................
Next smaller element named "B" based on source, target, value
source = smaller source
target = smaller target
value = smaller value

all the elements who's
source = element B target
target =
Value = element B value
...................
Next small element named "C" based on source, target, value
source = small source
target = small target
value = small value

all the elements who's
source = element C target
target =
Value = element C value

so on and so forth.

15
  • 4
    There are a lot of irrelevant properties and a large number of objects there, can you remove some of them, so we can more clearly see the logic you're looking for? Eg 10 items with 3 or 4 properties each is good, but 400 lines of an array literal is a bit much Commented May 8, 2020 at 7:28
  • 3
    What would be the second step? What keys should the resulting array be ordered by? Commented May 8, 2020 at 7:32
  • 1
    It seems you have some logical basis for sorting. It will be better if you can explain that also. Finding logic by ourselves in such a big dataset is cumbersome. Commented May 8, 2020 at 7:32
  • 1
    Your desired result isn't even sorted by the first step, so it's really unclear what you're trying to accomplish. Commented May 8, 2020 at 7:34
  • @CertainPerformance I have removed the irrelevant properties Commented May 8, 2020 at 7:48

1 Answer 1

2

You could keep the same group by looking at previous target and followingsource``, group them together, sort by value and get a flat array of objects.

var data = [{ source: 0, target: 1, value: 22 }, { source: 1, target: 2, value: 22 }, { source: 0, target: 1, value: 19 }, { source: 1, target: 3, value: 19 }, { source: 0, target: 1, value: 12 }, { source: 1, target: 4, value: 12 }, { source: 0, target: 1, value: 3.230000000000002 }, { source: 1, target: 5, value: 3.230000000000002 }, { source: 0, target: 6, value: 109 }, { source: 6, target: 7, value: 109 }, { source: 0, target: 6, value: 25 }, { source: 6, target: 8, value: 25 }, { source: 0, target: 6, value: 20 }, { source: 6, target: 3, value: 20 }, { source: 0, target: 6, value: 17 }, { source: 6, target: 9, value: 17 }, { source: 0, target: 6, value: 13 }, { source: 6, target: 10, value: 13 }, { source: 0, target: 6, value: 11 }, { source: 6, target: 11, value: 11 }, { source: 0, target: 6, value: 7 }, { source: 6, target: 12, value: 7 }, { source: 0, target: 6, value: 7 }, { source: 6, target: 13, value: 7 }, { source: 0, target: 6, value: 6 }, { source: 6, target: 14, value: 6 }, { source: 0, target: 6, value: 4 }, { source: 6, target: 15, value: 4 }, { source: 0, target: 6, value: 2 }, { source: 6, target: 4, value: 2 }],
    result = data
        .reduce((r, o) => {
            let last = r[r.length - 1];
            if (last && last[last.length - 1].target === o.source) last.push(o);
            else r.push([o]);
            return r;
        }, [])
        .sort(([a], [b]) => a.source - b.source || a.target - b.target || a.value - b.value)
        .flat();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

11 Comments

Can u please also share EMCA script 5 version as well?
Thanks a lot, you are genius.
There a small problem, your sorted array has missed an element as compared to my result array. { "source": 0, "target": 6, "value": 7 }
it is here { "source": 6, "target": 14, "value": 6 }, { "source": 0, "target": 6, "value": 7 }, { "source": 6, "target": 12, "value": 7 },
In the above link left side is my result array.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.