Примените метод ко всем ключам в объекте JavaScript, которые соответствуют условию - PullRequest
0 голосов
/ 01 апреля 2019

Я хотел бы применить функцию ко всем методам в объекте JSON, имя которых соответствует условию в моем случае «имя файла».Проблема заключается в том, что имя файла является вложенным свойством в объекте JSON, обычно это просто вложенный 1 уровень, но потенциально может быть больше.Я рассмотрел только async.each, хотя объект и просто посмотреть, есть ли у этого объекта свойство, которое я хочу, и запустить мою функцию, но это не кажется эффективным.

Примером объекта является

"hello"{
      "name": "Distribution Board 5",
      "Filename": "helloworld.png",
      "id": "5",
      "location": "somewhere",
      "description": "something",
}
"test"{
      "testproperty": 123
      "anothertest": 456
}
"extra": [
        {
          "Filename": "image.png",
          "Tag": "It's just a square",
          "Deleted": false
        }
]

Можете ли вы предложить эффективную реализацию проблемы

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

const object = {
  hello: {
    name: 'Distribution Board 5',
    Filename: 'helloworld.png',
    id: '5',
    location: 'somewhere',
    description: 'something'
  },
  test: {
    testproperty: 123,
    anothertest: 456,
    nestedproperty: {
      mismatching: 'key',
      Filename: 'test.jpg'
    }
  },
  extra: [{
    Filename: 'image.png',
    Tag: 'It\'s just a square',
    Deleted: false
  }]
}

function walk(o, fn, key) {
  switch (typeof o) {
    case 'object':
      if (o) {
        Object.entries(o).forEach(
          ([key, value]) => walk(value, fn, key)
        )
        break
      }
    default:
      fn(key, o)
      break
  }
}

walk(object, (key, value) => {
  if (key === 'Filename') console.log(`Found ${value}`)
})

Вот функция walk(), которая работает с сериализуемыми объектами JSON.Функция обратного вызова fn может выполнить необходимую логику.

0 голосов
/ 01 апреля 2019

Я не думаю, что async.each нужен здесь. Это можно сделать с помощью небольшого кода вроде этого:

const run = (obj) => Object.keys(obj).find(
    x => x === "Filename" 
        || typeof obj[x] === "object" 
        && obj[x]
        && run(obj[x])
);

run(YourObjectHere)

Он просто пройдет рекурсивно через все ваши ключи и проверит, является ли один из них "Имя файла".

Возможно, это можно улучшить с помощью Object.keys(x).includes, но это будет сложнее, все зависит от того, сколько объектов содержится в вашем наборе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...