Как проверить, существует ли вложенное свойство JSON и сколько вложенных свойств оно имеет?

Austin Ballard спросил: 13 июня 2018 в 05:38 в: javascript

Это мое затруднение в основном основано на количестве уровней сложности. Я пытаюсь понять логику JavaScript, но синтаксис JSON тоже усложняется, поэтому приветствуются любые предложения.

У меня есть файл JSON с более или менее следующей структурой, за исключением того, что у меня есть целое много свойств каждого типа кода:

[{
  "000": {
    "code": "A",
    "description": "Poor circulation",
  },
  "001": {
    "code": "B",
    "description": "Pain in foot",
    "subCodes": {
      "0": {
        "Right":"1",
        "Left":"2"
      }
    }
  },
  "003": {
    "code": "C",
    "description": "Exostosis",
    "subCodes": {
      "0": {
        "Ankle":"1",
        "Foot":"2",
        "Leg":"3",
        "Thigh":"4"
      }
    }
  },
}]

Большинство кодов похоже на код A, и их нужно оставить в покое. Тем не менее, мне нужно отфильтровать и пометить все коды, которые похожи на B (то есть иметь свойство "subcodes" И только два вложенных свойства "Right" и "Left"), чтобы рядом с ними "+"; и такие коды, как C (с любыми субкодами, но только "Right" и "Left"), должны быть помечены знаком "*".

Предполагая, что я устанавливаю переменную для файла JSON, как я могу их отфильтровать? Остальная часть моего кода выталкивает все описания в массив и коды в массив, чтобы передать их в div, но как я могу иметь массив рядом с только кодами с субкодами, а затем дополнительно фильтровать их в соответствии с их дочерним элементом значения?

В принципе, моя конечная цель состоит в том, чтобы иметь div со всеми кодами, подобными этому:

A    Poor circulation
B  + Pain in foot
C  * Exostosis

Следует ли вообще отказаться от метода массива? Есть ли более простой способ? Я использую только ванильный JavaScript.

3 ответа

Nina Scholz ответил: 13 июня 2018 в 07:17

Вы можете просто перебрать значения объекта и проверить условия.

function getValues(data) {
    return data.reduce(
        (r, o) => r.concat(
            Object
                .values(o)
                .map(({ code, description, subCodes }) => [
                    code,
                    subCodes ? 'Left' in subCodes[0] && 'Right' in subCodes[0] ? '+' : '*' : ' ',
                    description
                ].join(' '))),
        []
    );
}

var data = [{ "000": { code: "A", description: "Poor circulation" }, "001": { code: "B", description: "Pain in foot", subCodes: { "0": { Right: "1", Left: "2" } } }, "003": { code: "C", description: "Exostosis", subCodes: { "0": { Ankle: "1", Foot: "2", Leg: "3", Thigh: "4" } } } }];

console.log(getValues(data));
Stefano Bettinelli ответил: 13 июня 2018 в 07:41

Быстрый и грязный reduce взломать, который подходит для вас, чтобы иметь такой div.

A    Poor circulation
B  + Pain in foot
C  * Exostosis
const data = {
  "000": {
    "code": "A",
    "description": "Poor circulation",
  },
  "001": {
    "code": "B",
    "description": "Pain in foot",
    "subCodes": {
      "0": {
        "Right": "1",
        "Left": "2"
      }
    }
  },
  "003": {
    "code": "C",
    "description": "Exostosis",
    "subCodes": {
      "0": {
        "Ankle": "1",
        "Foot": "2",
        "Leg": "3",
        "Thigh": "4"
      }
    }
  },
};

let divElement = "<div>\n";

const reduceToDiv = (acc, curr) => {
  if (data[curr]["code"]) {
    const description = data[curr]["description"];
    if (data[curr]["subCodes"]) {
      const subCodes = data[curr]["subCodes"][0];
      if ("Left" in subCodes && "Right" in subCodes) acc.push("B  + " + description);
      else acc.push("C  * " + description);
    } else acc.push("A    " + description);
  }
  return acc;
};

divElement += Object.keys(data).reduce(reduceToDiv, []).join("\n") + "\n</div>";
console.log(divElement);
Stefano Bettinelli ответил: 17 июня 2018 в 02:06
Это сделает трюк, затем const obj = data[curr]["subCodes"][0]; return Object.keys(obj).length === 2 && obj["left"] && obj["right"];
Austin Ballard ответил: 15 июня 2018 в 07:49
Это работало очень хорошо; однако некоторые коды имеют "левый", "правый" и другие значения, которые должны быть отмечены символом "*" вместо "+". Есть ли способ сделать проверку кода, если есть ТОЛЬКО "правый" и "левый", и больше ничего?
Melchia ответил: 13 июня 2018 в 08:16

Ваш начальный вход представляет собой массив с одним элементом, я не знаю, сделал ли это специально, но это работает с вашим данным массивом:

const input = [{
  "000": {
    "code": "A",
    "description": "Poor circulation",
  },
  "001": {
    "code": "B",
    "description": "Pain in foot",
    "subCodes": {
      "0": {
        "Right":"1",
        "Left":"2"
      }
    }
  },
  "003": {
    "code": "C",
    "description": "Exostosis",
    "subCodes": {
      "0": {
        "Ankle":"1",
        "Foot":"2",
        "Leg":"3",
        "Thigh":"4"
      }
    }
  },
}];

const filterJson = arr => {
return Object.values(arr[0]).map(el => !el.hasOwnProperty('subCodes') ? `A   ${el.description}` : JSON.stringify(el.subCodes).includes('Right') && JSON.stringify(el.subCodes).includes('Left') ? `B  +${el.description}` : `C  *${el.description}`);
}

console.log(filterJson(input));

Дополнительное видео по вопросу: Как проверить, существует ли вложенное свойство JSON и сколько вложенных свойств оно имеет?

Лекция 19: Программа вывода простых чисел

Изучаем Ajax | Урок №2 - Основы Ajax

009. Немножечко о типах данных в JS