Update an existing array element with jsonnet












1














I am using jsonnet to read in a value which consists of an array. I want to modify the first element in that array to add a value. The data structure looks like this:



{
"my_value": [
{
"env": "something"
},
{
"var": "bar"
}
]
}


I want to add a value to my_value[0]. How can I reference that in jsonnet?










share|improve this question



























    1














    I am using jsonnet to read in a value which consists of an array. I want to modify the first element in that array to add a value. The data structure looks like this:



    {
    "my_value": [
    {
    "env": "something"
    },
    {
    "var": "bar"
    }
    ]
    }


    I want to add a value to my_value[0]. How can I reference that in jsonnet?










    share|improve this question

























      1












      1








      1







      I am using jsonnet to read in a value which consists of an array. I want to modify the first element in that array to add a value. The data structure looks like this:



      {
      "my_value": [
      {
      "env": "something"
      },
      {
      "var": "bar"
      }
      ]
      }


      I want to add a value to my_value[0]. How can I reference that in jsonnet?










      share|improve this question













      I am using jsonnet to read in a value which consists of an array. I want to modify the first element in that array to add a value. The data structure looks like this:



      {
      "my_value": [
      {
      "env": "something"
      },
      {
      "var": "bar"
      }
      ]
      }


      I want to add a value to my_value[0]. How can I reference that in jsonnet?







      jsonnet






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jul 9 '18 at 23:41









      jaxxstorm

      4,51211730




      4,51211730
























          2 Answers
          2






          active

          oldest

          votes


















          1














          A possible approach using https://jsonnet.org/ref/stdlib.html#mapWithIndex as per below:



          $ cat foo.jsonnet 
          local my_array = [
          {
          env: "something",
          },
          {
          var: "bar",
          },
          ];
          local add_by_idx(idx) = (
          if idx == 0 then { extra: "stuff" } else {}
          );
          std.mapWithIndex(function(i, v) v + add_by_idx(i), my_array)

          $ jsonnet foo.jsonnet
          [
          {
          "env": "something",
          "extra": "stuff"
          },
          {
          "var": "bar"
          }
          ]





          share|improve this answer































            0














            A IMO better approach: converting the array to object for easier overloading, then ab-using the fact that jsonnet handles objects by alpha-sorting its keys:



            $ cat foo.jsonnet
            local array_a = [
            { env: "something" },
            { var: "bar" },
            ];

            local array_b = [
            {},
            { extra: "stuff" },
            ];

            // "Standarize" index key string as "%06d"
            local _idx(i) = ("%06d" % [i]);

            // Convert array [elem1, elem2, ...] to object as { 000000: elem0, 000001: elem1, ...}
            local _to_obj(a) = std.foldl(
            function(x, y) x + y,
            std.mapWithIndex(function(i, v) { [_idx(i)]: v }, a),
            {}
            );

            local _to_array(obj) = [obj[k] for k in std.objectFields(obj)];

            _to_array(std.mergePatch(_to_obj(array_a), _to_obj(array_b)))

            $ jsonnet foo.jsonnet
            [
            {
            "env": "something"
            },
            {
            "extra": "stuff",
            "var": "bar"
            }
            ]





            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f51255389%2fupdate-an-existing-array-element-with-jsonnet%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              A possible approach using https://jsonnet.org/ref/stdlib.html#mapWithIndex as per below:



              $ cat foo.jsonnet 
              local my_array = [
              {
              env: "something",
              },
              {
              var: "bar",
              },
              ];
              local add_by_idx(idx) = (
              if idx == 0 then { extra: "stuff" } else {}
              );
              std.mapWithIndex(function(i, v) v + add_by_idx(i), my_array)

              $ jsonnet foo.jsonnet
              [
              {
              "env": "something",
              "extra": "stuff"
              },
              {
              "var": "bar"
              }
              ]





              share|improve this answer




























                1














                A possible approach using https://jsonnet.org/ref/stdlib.html#mapWithIndex as per below:



                $ cat foo.jsonnet 
                local my_array = [
                {
                env: "something",
                },
                {
                var: "bar",
                },
                ];
                local add_by_idx(idx) = (
                if idx == 0 then { extra: "stuff" } else {}
                );
                std.mapWithIndex(function(i, v) v + add_by_idx(i), my_array)

                $ jsonnet foo.jsonnet
                [
                {
                "env": "something",
                "extra": "stuff"
                },
                {
                "var": "bar"
                }
                ]





                share|improve this answer


























                  1












                  1








                  1






                  A possible approach using https://jsonnet.org/ref/stdlib.html#mapWithIndex as per below:



                  $ cat foo.jsonnet 
                  local my_array = [
                  {
                  env: "something",
                  },
                  {
                  var: "bar",
                  },
                  ];
                  local add_by_idx(idx) = (
                  if idx == 0 then { extra: "stuff" } else {}
                  );
                  std.mapWithIndex(function(i, v) v + add_by_idx(i), my_array)

                  $ jsonnet foo.jsonnet
                  [
                  {
                  "env": "something",
                  "extra": "stuff"
                  },
                  {
                  "var": "bar"
                  }
                  ]





                  share|improve this answer














                  A possible approach using https://jsonnet.org/ref/stdlib.html#mapWithIndex as per below:



                  $ cat foo.jsonnet 
                  local my_array = [
                  {
                  env: "something",
                  },
                  {
                  var: "bar",
                  },
                  ];
                  local add_by_idx(idx) = (
                  if idx == 0 then { extra: "stuff" } else {}
                  );
                  std.mapWithIndex(function(i, v) v + add_by_idx(i), my_array)

                  $ jsonnet foo.jsonnet
                  [
                  {
                  "env": "something",
                  "extra": "stuff"
                  },
                  {
                  "var": "bar"
                  }
                  ]






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Jul 10 '18 at 0:23

























                  answered Jul 10 '18 at 0:14









                  jjo

                  5537




                  5537

























                      0














                      A IMO better approach: converting the array to object for easier overloading, then ab-using the fact that jsonnet handles objects by alpha-sorting its keys:



                      $ cat foo.jsonnet
                      local array_a = [
                      { env: "something" },
                      { var: "bar" },
                      ];

                      local array_b = [
                      {},
                      { extra: "stuff" },
                      ];

                      // "Standarize" index key string as "%06d"
                      local _idx(i) = ("%06d" % [i]);

                      // Convert array [elem1, elem2, ...] to object as { 000000: elem0, 000001: elem1, ...}
                      local _to_obj(a) = std.foldl(
                      function(x, y) x + y,
                      std.mapWithIndex(function(i, v) { [_idx(i)]: v }, a),
                      {}
                      );

                      local _to_array(obj) = [obj[k] for k in std.objectFields(obj)];

                      _to_array(std.mergePatch(_to_obj(array_a), _to_obj(array_b)))

                      $ jsonnet foo.jsonnet
                      [
                      {
                      "env": "something"
                      },
                      {
                      "extra": "stuff",
                      "var": "bar"
                      }
                      ]





                      share|improve this answer




























                        0














                        A IMO better approach: converting the array to object for easier overloading, then ab-using the fact that jsonnet handles objects by alpha-sorting its keys:



                        $ cat foo.jsonnet
                        local array_a = [
                        { env: "something" },
                        { var: "bar" },
                        ];

                        local array_b = [
                        {},
                        { extra: "stuff" },
                        ];

                        // "Standarize" index key string as "%06d"
                        local _idx(i) = ("%06d" % [i]);

                        // Convert array [elem1, elem2, ...] to object as { 000000: elem0, 000001: elem1, ...}
                        local _to_obj(a) = std.foldl(
                        function(x, y) x + y,
                        std.mapWithIndex(function(i, v) { [_idx(i)]: v }, a),
                        {}
                        );

                        local _to_array(obj) = [obj[k] for k in std.objectFields(obj)];

                        _to_array(std.mergePatch(_to_obj(array_a), _to_obj(array_b)))

                        $ jsonnet foo.jsonnet
                        [
                        {
                        "env": "something"
                        },
                        {
                        "extra": "stuff",
                        "var": "bar"
                        }
                        ]





                        share|improve this answer


























                          0












                          0








                          0






                          A IMO better approach: converting the array to object for easier overloading, then ab-using the fact that jsonnet handles objects by alpha-sorting its keys:



                          $ cat foo.jsonnet
                          local array_a = [
                          { env: "something" },
                          { var: "bar" },
                          ];

                          local array_b = [
                          {},
                          { extra: "stuff" },
                          ];

                          // "Standarize" index key string as "%06d"
                          local _idx(i) = ("%06d" % [i]);

                          // Convert array [elem1, elem2, ...] to object as { 000000: elem0, 000001: elem1, ...}
                          local _to_obj(a) = std.foldl(
                          function(x, y) x + y,
                          std.mapWithIndex(function(i, v) { [_idx(i)]: v }, a),
                          {}
                          );

                          local _to_array(obj) = [obj[k] for k in std.objectFields(obj)];

                          _to_array(std.mergePatch(_to_obj(array_a), _to_obj(array_b)))

                          $ jsonnet foo.jsonnet
                          [
                          {
                          "env": "something"
                          },
                          {
                          "extra": "stuff",
                          "var": "bar"
                          }
                          ]





                          share|improve this answer














                          A IMO better approach: converting the array to object for easier overloading, then ab-using the fact that jsonnet handles objects by alpha-sorting its keys:



                          $ cat foo.jsonnet
                          local array_a = [
                          { env: "something" },
                          { var: "bar" },
                          ];

                          local array_b = [
                          {},
                          { extra: "stuff" },
                          ];

                          // "Standarize" index key string as "%06d"
                          local _idx(i) = ("%06d" % [i]);

                          // Convert array [elem1, elem2, ...] to object as { 000000: elem0, 000001: elem1, ...}
                          local _to_obj(a) = std.foldl(
                          function(x, y) x + y,
                          std.mapWithIndex(function(i, v) { [_idx(i)]: v }, a),
                          {}
                          );

                          local _to_array(obj) = [obj[k] for k in std.objectFields(obj)];

                          _to_array(std.mergePatch(_to_obj(array_a), _to_obj(array_b)))

                          $ jsonnet foo.jsonnet
                          [
                          {
                          "env": "something"
                          },
                          {
                          "extra": "stuff",
                          "var": "bar"
                          }
                          ]






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Nov 12 '18 at 21:09

























                          answered Nov 12 '18 at 14:22









                          jjo

                          5537




                          5537






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f51255389%2fupdate-an-existing-array-element-with-jsonnet%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              List item for chat from Array inside array React Native

                              Thiostrepton

                              Caerphilly