根据键值对条件动态地将对象推入嵌套数组

dynamically push object into nested array based on key,value pair condition

我有以下对象:

{type=stuff, name=blablabla, variableId=x, fingerprint=xxxx, containerId=xxxx, accountId=xxxx, workspaceId=xxx, path=accounts/xxxx/containers/xxxx/workspaces/xx/variables/x, parentFolderId=x, parameter=[{value=auto, type=template, key=xxxxx}, {type=boolean, key=asdasdf, value=false}, {value=false, type=boolean, key=adasdasd}, {type=boolean, value=false, key=asdasdasd}, {type=list, key=fieldsToSet, list=[{map=[{value=asdasdas, type=template, key=asdasdas}, {value=asdasdas, type=template, key=value}], type=map}, {type=map, map=[{type=template, value=page, key=fieldName}, {type=template, key=value, value=asdasdasd}]}]}, {value=false, type=boolean, key=asdasd}, {type=boolean, value=false, key=asdasdasd}, {value=false, type=boolean, key=adasdasd}, {key=dimension, type=list, list=[{type=map, map=[{value=2, key=index, type=template}, {value=asdasd, type=template, key=dimension}]}, {type=map, map=[{value=3, type=template, key=index}, {value=asdasdasd, type=template, key=dimension}]}, {map=[{type=template, value=4, key=index}, {key=dimension, type=template, value=asdasdasd / asdasdasd}], type=map}, {map=[{type=template, value=5, key=index}, {value=asdasd, type=template, key=dimension}], type=map}, {type=map, map=[{value=6, type=template, key=index}, {key=dimension, type=template, value=asdasdasd}]}, {map=[{type=template, key=index, value=7}, {value=asdasd, type=template, key=dimension}], type=map}, {type=map, map=[{key=index, value=8, type=template}, {value=asdasdasd, key=dimension, type=template}]}]}, {key=enableEcommerce, type=boolean, value=false}, {value=asdasdasd, type=template, key=asdasdasd}], tagManagerUrl=https://blabla.com/#/asdasd/accounts/asdasd/containers/xxxxx/workspaces/xxxx/variables/x?apiLink=variable}

我想修改它,将这个对象 {type=map, map=[{key=fieldName, value=cookieExpires, type=template}, {key=value, value=33696000, type=template}]} 添加到键为 fieldsToSet 的嵌套对象中。

到目前为止,我已经尝试过类似的方法,但它不起作用:

element.parameter.filter(obj => { return obj.key === "fieldsToSet" }).push(newObject);

我需要一些动态的东西,因为对象和数组的数量总是在变化。

我相信你的目标如下。

  • 您想使用 Google Apps 脚本将 newObject 添加到 element.parameter[]

修改点:

  • 在您的脚本中,element.parameter.filter(obj => { return obj.key === "fieldsToSet" }) returns 对象包括 obj.key === "fieldsToSet"。这样,当 push(newObject) 用于此时, newObject 将添加到检索到的元素中。我认为这可能是您遇到问题的原因。

在这个回答中,我想提出以下修改脚本。在此示例脚本中,我将您的值转换为 JSON 对象,因为我认为您的示例值可能直接从具有 Logger.log.

的对象中获取

修改后的脚本:

var element = {"type":"stuff","name":"blablabla","variableId":"x","fingerprint":"xxxx","containerId":"xxxx","accountId":"xxxx","workspaceId":"xxx","path":"accounts/xxxx/containers/xxxx/workspaces/xx/variables/x","parentFolderId":"x","parameter":[{"value":"auto","type":"template","key":"xxxxx"},{"type":"boolean","key":"asdasdf","value":false},{"value":false,"type":"boolean","key":"adasdasd"},{"type":"boolean","value":false,"key":"asdasdasd"},{"type":"list","key":"fieldsToSet","list":[{"map":[{"value":"asdasdas","type":"template","key":"asdasdas"},{"value":"asdasdas","type":"template","key":"value"}],"type":"map"},{"type":"map","map":[{"type":"template","value":"page","key":"fieldName"},{"type":"template","key":"value","value":"asdasdasd"}]}]},{"value":false,"type":"boolean","key":"asdasd"},{"type":"boolean","value":false,"key":"asdasdasd"},{"value":false,"type":"boolean","key":"adasdasd"},{"key":"dimension","type":"list","list":[{"type":"map","map":[{"value":2,"key":"index","type":"template"},{"value":"asdasd","type":"template","key":"dimension"}]},{"type":"map","map":[{"value":3,"type":"template","key":"index"},{"value":"asdasdasd","type":"template","key":"dimension"}]},{"map":[{"type":"template","value":4,"key":"index"},{"key":"dimension","type":"template","value":"asdasdasd / asdasdasd"}],"type":"map"},{"map":[{"type":"template","value":5,"key":"index"},{"value":"asdasd","type":"template","key":"dimension"}],"type":"map"},{"type":"map","map":[{"value":6,"type":"template","key":"index"},{"key":"dimension","type":"template","value":"asdasdasd"}]},{"map":[{"type":"template","key":"index","value":7},{"value":"asdasd","type":"template","key":"dimension"}],"type":"map"},{"type":"map","map":[{"key":"index","value":8,"type":"template"},{"value":"asdasdasd","key":"dimension","type":"template"}]}]},{"key":"enableEcommerce","type":"boolean","value":false},{"value":"asdasdasd","type":"template","key":"asdasdasd"}],"tagManagerUrl":"https://blabla.com/#/asdasd/accounts/asdasd/containers/xxxxx/workspaces/xxxx/variables/x?apiLink=variable"};

var newObject = {"type":"map","map":[{"key":"fieldName","value":"cookieExpires","type":"template"},{"key":"value","value":33696000,"type":"template"}]};

element.parameter.forEach(({key},_,a) => {
  if (key === "fieldsToSet") {
    a.push(newObject);
  }
});
console.log(element);

注:

  • 以上示例值 element 是从您问题中的示例值转换而来的。所以当我的转换不正确时,请修改或替换为您的实际值。

  • 例如在element.parameter[].list[]中添加newObject时,可以使用如下脚本

      element.parameter.forEach(obj => {
        if (obj.key === "fieldsToSet") {
          obj.list.push(newObject);
        }
      });
    

参考文献: