Re: merging container arrays

2020-11-01 Thread Andre Pany via Digitalmars-d-learn

On Sunday, 1 November 2020 at 05:23:42 UTC, Vino wrote:

On Saturday, 31 October 2020 at 15:16:22 UTC, Vino wrote:

[...]


Hi All,

   I was able to find a solution using a different approach, 
the code is in the link
https://run.dlang.io/is/Jx4NLw, request your help on to get the 
value using the Key


[...]


I assume it should be

foreach(i; data.byKey)
{
writeln(data[i]);
}

Kind regards
Andre


Re: merging container arrays

2020-10-31 Thread Vino via Digitalmars-d-learn

On Saturday, 31 October 2020 at 15:16:22 UTC, Vino wrote:

Hi All,

   Request your help on the below code, the requirement is that 
result's are stored in one single container.


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

auto api1()
{
 string apidata1 = `{"items": [
{"name":"T01","hostname":"test01","pool":"Development"},
{"name":"T02","hostname":"test02","pool":"Quality"},
{"name":"T03","hostname":"test03","pool":"Production"}
  ]}`;

 Array!(Tuple!(string, string, string)) data1 = 
parseJson(apidata1)["items"].byElement

 .map!(item => tuple(
 
item["name"].get!string("default"),
 
item["hostname"].get!string("default"),
 
item["pool"].get!string("default")

 ));
 return data1[];
}

auto api2()
{
 string apidata2 = `{"items": [
{"hostname":"test01","type":"Development"},
{"hostname":"test02","type":"Quality"},
{"hostname":"test03","type":"Production"}
  ]}`;

 Array!(Tuple!(string, string)) data2 = 
parseJson(apidata2)["items"].byElement

 .map!(item => tuple(
 
item["hostname"].get!string("default"),
 
item["type"].get!string("default")

 ));
 return data2[];
}

auto api3()
{
 string apidata3 = `{"items": [
{"type":"Development","location":"L1"},
{"type":"Quality","location":"L2"},
{"type":"Production","location":"L3"}
  ]}`;

 Array!(Tuple!(string, string)) data3 = 
parseJson(apidata3)["items"].byElement

.map!(item => tuple(

item["type"].get!string("default"),

item["location"].get!string("default")

 ));
 return data3[];
}



void main()
{
 auto apidata1 = api1;
 auto apidata2 = api2;
 auto apidata3 = api3;
 if(!apidata1.empty) {
foreach(ref x , y; lockstep(apidata1[], apidata2[])) {
   if(x[1] == y[0]){
  writeln(y[1]);  // the output needs to be merged with 
apidata1

   }
}
 }
 if(!apidata2.empty) {
foreach(ref x, y; lockstep(apidata2[], apidata3[])) {
   if(x[1] == y[0]) {
  writeln(y[1]); // the output needs to be merged with 
apidata1

   }
}
 }
 writeln(apidata1[]); // Should 
contain(name,hostname,pool,type,location)

}

From,
Vino.B


Hi All,

   I was able to find a solution using a different approach, the 
code is in the link
https://run.dlang.io/is/Jx4NLw, request your help on to get the 
value using the Key


In PHP we can get the value of the associative array using the 
key as below


PHP:
foreach($array as $k) { print_r($k["Name"]); }

So request you help on how the same in d

Tired the below , no luck

1 > foreach(i; data.byKey) { writeln(i["Name"]); }

Error:
onlineapp.d(53,37): Error: cannot implicitly convert expression 
`"Name"` of type `string` to `ulong`


2 > foreach (ref i; data) writeln(i["Name"]);
3 > foreach(i; data.byValue) { writeln(i["Name"]); }
4 > foreach(i; data) { writeln(get(i["Name"])); }

Error:
onlineapp.d(53,38): Error: function 
`std.container.array.Array!string.Array.opIndex(ulong i) inout` 
is not callable using argument types `(string)`
onlineapp.d(53,38):cannot pass argument `"Name"` of type 
`string` to parameter `ulong i`


From,
Vino.B



merging container arrays

2020-10-31 Thread Vino via Digitalmars-d-learn

Hi All,

   Request your help on the below code, the requirement is that 
result's are stored in one single container.


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

auto api1()
{
 string apidata1 = `{"items": [
{"name":"T01","hostname":"test01","pool":"Development"},
{"name":"T02","hostname":"test02","pool":"Quality"},
{"name":"T03","hostname":"test03","pool":"Production"}
  ]}`;

 Array!(Tuple!(string, string, string)) data1 = 
parseJson(apidata1)["items"].byElement

 .map!(item => tuple(
 
item["name"].get!string("default"),
 
item["hostname"].get!string("default"),
 
item["pool"].get!string("default")

 ));
 return data1[];
}

auto api2()
{
 string apidata2 = `{"items": [
{"hostname":"test01","type":"Development"},
{"hostname":"test02","type":"Quality"},
{"hostname":"test03","type":"Production"}
  ]}`;

 Array!(Tuple!(string, string)) data2 = 
parseJson(apidata2)["items"].byElement

 .map!(item => tuple(
 
item["hostname"].get!string("default"),
 
item["type"].get!string("default")

 ));
 return data2[];
}

auto api3()
{
 string apidata3 = `{"items": [
{"type":"Development","location":"L1"},
{"type":"Quality","location":"L2"},
{"type":"Production","location":"L3"}
  ]}`;

 Array!(Tuple!(string, string)) data3 = 
parseJson(apidata3)["items"].byElement

.map!(item => tuple(

item["type"].get!string("default"),

item["location"].get!string("default")

 ));
 return data3[];
}



void main()
{
 auto apidata1 = api1;
 auto apidata2 = api2;
 auto apidata3 = api3;
 if(!apidata1.empty) {
foreach(ref x , y; lockstep(apidata1[], apidata2[])) {
   if(x[1] == y[0]){
  writeln(y[1]);  // the output needs to be merged with 
apidata1

   }
}
 }
 if(!apidata2.empty) {
foreach(ref x, y; lockstep(apidata2[], apidata3[])) {
   if(x[1] == y[0]) {
  writeln(y[1]); // the output needs to be merged with 
apidata1

   }
}
 }
 writeln(apidata1[]); // Should 
contain(name,hostname,pool,type,location)

}

From,
Vino.B