помогите правильно распарсить json средствами javascript (google apps script)

есть json содержащий что-то вроде

[
  {
    "contents": [
      {
        "amount": 40,
        "type_id": 2389
      },
      {
        "amount": 40,
        "type_id": 2390
      }
    ],
    "last_cycle_start": "2024-03-06T23:34:32Z",
    "latitude": 1.7929432392120361,
    "longitude": 5.795536994934082,
    "pin_id": 1044610962318,
    "schematic_id": 67,
    "type_id": 2480
  },
  {
    "contents": [
      {
        "amount": 40,
        "type_id": 2389
      },
      {
        "amount": 40,
        "type_id": 2390
      }
    ],
    "last_cycle_start": "2024-03-06T23:34:32Z",
    "latitude": 1.7809253931045532,
    "longitude": 5.796088695526123,
    "pin_id": 1044610962322,
    "schematic_id": 67,
    "type_id": 2480
  }
]

здесь два элемента, для примера достаточно

Собственно не получается получить все свойства используя метод JSON.parse, т.е. собственно, получается обойти элементы по индексу или иными способами. Получаю индексы и могу их вывести, а получить сами свойства не получается ни по индексу ни по ключу.

с более простым json-объектом, состоящим из одного элемента, все хорошо.

Прошу подсказать как правильно парсить такие и/или более сложные объекты json

функция:

function GetDataInJsonMixSimple_consumption(data_json,id_resource){
  var DATA = JSON.parse(data_json, function(key, value){ return (value);}
  );
  quantity = 0;
  for (let i=0;i<DATA.length; i++){
      var objt = DATA[i];

      type_id = objt.type_id;
      //console.log("type_id",type_id);
      if (type_id == 2480){
        contents = objt.contents;
        //console.log("contents",contents);
        
        for (let j=0;j<contents.length; j++){
          //console.log("content",contents[j]);
          if (contents[j].type_id == id_resource) {
            quantity += contents[j].amount;
          }
        }
      }
      
  }
  console.log("quantity",quantity);
  return quantity;
}

let consumption_quantity = GetDataInJsonMixSimple_consumption(data_json1, 2389);

Ответы (2 шт):

Автор решения: Armen

const json = [
  {
    contents: [
      {
        amount: 25,
        type_id: 2389,
      },
      {
        amount: 40,
        type_id: 2390,
      },
    ],
    type_id: 2480,
  },
  {
    contents: [
      {
        amount: 25,
        type_id: 2389,
      },
      {
        amount: 40,
        type_id: 2390,
      },
    ],
    type_id: 2480,
  },
  {
    type_id: 2481,
    contents: [
      {
        amount: 25,
        type_id: 2389,
      },
      {
        amount: 40,
        type_id: 2390,
      },
    ],
  },
];

//то что у тебя есть и так работает(просто чуток подчистил)
const getQuantity = (json, approvedInnerId) => {
  const parsedJson = JSON.parse(json);
  let quantity = 0;
  for (let i = 0; i < parsedJson.length; i++) {
    const { type_id, contents } = parsedJson[i];

    if (type_id == 2480) {
      for (let j = 0; j < contents.length; j++) {
        const { type_id, amount } = contents[j];
        if (type_id == approvedInnerId) {
          quantity += amount;
        }
      }
    }
  }
  return quantity;
};

//более быстрый вариант реализации
const getQuantityFaster = (json, approvedInnerId) => {
  const APPROVED_ROOT_ID = 2480;
  let quantity = 0;
  let temporaryAmountForUpQuantity = 0;
  let amount = 0;
  JSON.parse(json, (key, value) => {
    if (key === "amount") {
      amount = value;
    }
    const isCorrectInnerId = key === "type_id" && value === approvedInnerId;
    if (isCorrectInnerId) {
      temporaryAmountForUpQuantity = amount;
    }
    const isCorrectRootId = value?.contents && value?.type_id === APPROVED_ROOT_ID;
    if (isCorrectRootId) {
      quantity += temporaryAmountForUpQuantity;
    }
    return value;
  });

  return quantity;
};


const quantity = getQuantity(JSON.stringify(json), 2389);
const quantity2 = getQuantityFaster(JSON.stringify(json), 2390);

console.log(quantity)
console.log(quantity2)

→ Ссылка
Автор решения: Antonio

Вот более читаемый вариант кода:

const stringify = (json) => {
  return JSON.stringify(json, null, 2);
}

const getQuantity = (json, approvedInnerId) => {
  const parsedJson = JSON.parse(stringify(json));
  let quantity = 0;
  parsedJson.forEach(item => {
    if (item.type_id == 2480) {
      item.contents.forEach(content => {
        if (content.type_id == approvedInnerId) {
          quantity += content.amount;
        }
      });
    }
  });
  return quantity;
};

const x = () => {
  console.log(getQuantity(json, 2390));
  console.log(getQuantity(json, 2389));
}
→ Ссылка