Thread overview
Removind duplicates for JSON string
Nov 01, 2020
Vino
Nov 01, 2020
Anonymouse
Nov 01, 2020
Imperatorn
November 01, 2020
Hi All,

   Request your help on how to remove duplicates in JSON.

Code:
import asdf;
import std.algorithm : map, filter, uniq;
import std.container.array;
import std.stdio : writeln;
import std.typecons : Tuple, tuple;
import std.array;

void main() {
string apidata = `{
"items":
  [
    { "name":"DEV", "Configuration":{"type":"D1"} },
    { "name":"DEV" },
    { "name":"DEV", "Configuration":{"type":"D1"} },
    { "name":"QAS", "Configuration":{"type":"Q1"} },
    { "name":"QAS", "Configuration":{"type":"Q1"} },
    { "name":"QAS" },
    { "name":"PRD", "Configuration":{"type":"P1"} },
    { "name":"PRD", "Configuration":{"type":"P1"} },
    { "name":"PRD" }
  ]
}`;

Array!(Tuple!(string, string)) data =
          parseJson(apidata)["items"]
          .byElement
          .map!(item => tuple(
                item["name"].get!string("default"),
                item["Configuration","type"].get!string("default")
            ));

    writeln(data[]);
}

Output: The above code produces the below output

[
 Tuple!(string, string)("DEV", "D1"),
 Tuple!(string, string)("DEV", "default"),
 Tuple!(string, string)("DEV", "D1"),
 Tuple!(string, string)("QAS", "Q1"),
 Tuple!(string, string)("QAS", "Q1"),
 Tuple!(string, string)("QAS", "default"),
 Tuple!(string, string)("PRD", "P1"),
 Tuple!(string, string)("PRD", "P1"),
 Tuple!(string, string)("PRD", "default")
]

Required Output
[
 Tuple!(string, string)("DEV", "D1"),
 Tuple!(string, string)("QAS", "Q1"),
 Tuple!(string, string)("PRD", "P1"),
]

From,
Vino.B


November 01, 2020
On Sunday, 1 November 2020 at 09:14:35 UTC, Vino wrote:
> [
>  Tuple!(string, string)("DEV", "D1"),
>  Tuple!(string, string)("DEV", "default"),
>  Tuple!(string, string)("DEV", "D1"),
>  Tuple!(string, string)("QAS", "Q1"),
>  Tuple!(string, string)("QAS", "Q1"),
>  Tuple!(string, string)("QAS", "default"),
>  Tuple!(string, string)("PRD", "P1"),
>  Tuple!(string, string)("PRD", "P1"),
>  Tuple!(string, string)("PRD", "default")
> ]
>
> Required Output
> [
>  Tuple!(string, string)("DEV", "D1"),
>  Tuple!(string, string)("QAS", "Q1"),
>  Tuple!(string, string)("PRD", "P1"),
> ]
>
> From,
> Vino.B

I can only test with Phobos (no asdf on run.dlang.io), but isn't just normal sort and uniq what you want?

data[]
    .array
    .sort
    .uniq!((tup1, tup2) => tup1[0] == tup2[0]);

https://run.dlang.io/is/a3KHaE

Sorting "default" values can be tricky but they conveniently cede to explicit D1/Q1/P1 values because of ASCII. Otherwise you would have to provide different sort and uniq predicates.
November 01, 2020
On Sunday, 1 November 2020 at 13:31:19 UTC, Anonymouse wrote:
> On Sunday, 1 November 2020 at 09:14:35 UTC, Vino wrote:
>> [...]
>
> I can only test with Phobos (no asdf on run.dlang.io), but isn't just normal sort and uniq what you want?
>
> data[]
>     .array
>     .sort
>     .uniq!((tup1, tup2) => tup1[0] == tup2[0]);
>
> https://run.dlang.io/is/a3KHaE
>
> Sorting "default" values can be tricky but they conveniently cede to explicit D1/Q1/P1 values because of ASCII. Otherwise you would have to provide different sort and uniq predicates.

Tip:
You can find asdf under "Add library" on run.dlang.io