Nano Hash - криптовалюты, майнинг, программирование

Как перебрать вложенную пару значений ключа и отфильтровать ее на основе значений массива

У меня есть массив, построенный на основе пользовательского ввода. Я пытаюсь перебрать пару вложенных значений ключа и проверить, соответствуют ли значения в нем какому-либо значению данного массива. Цель состоит в том, чтобы сделать средство поиска.

Мой массив:

FilteredSelectedOptions=["20180211","Trax","Vienna","AN01020"]

Моя пара ключевых значений:

trips = {
  "20180201": [{
      "journeyId": 1001,
      "Number": "001",
      "DriverName": "Alex",
      "Transporter": {
        "id": "T1",
        "number": "AN01001",
        "Company": "Tranzient"
      },
      "place": [{
          "id": 001,
          "value": "Washington DC"
        },
        {
          "id": 002,
          "value": "Canberra"
        }
      ],
    },
    {
      "journeyId": 1002,
      "Number": "001",
      "DriverName": "Tom",
      "Transporter": {
        "id": "T2",
        "number": "AN01002",
        "Company": "Trax"
      },
      "place": [{
          "id": 2,
          "value": "Canberra"
        },
        {
          "id": 4,
          "value": "Vienna"
        }
      ],
    },
    {
      "journeyId": 1003,
      "Number": "004",
      "DriverName": "Jack",
      "Transporter": {
        "id": "T3",
        "number": "AN01003",
        "Company": "Trax"
      },
      "place": [{
        "id": 1,
        "value": "Washington DC",
      }, {
        "id": 4,
        "value": "Vienna",
      }],
    }
  ],
  "20180211": [{
      "journeyId": 1004,
      "Number": "005",
      "DriverName": "Jack",
      "Transporter": {
        "id": "T3",
        "number": "AN01013",
        "Company": "Trax"
      },
      "place": [{
          "id": 5,
          "value": "Bridgetown"
        },
        {
          "id": 6,
          "value": "Ottawa"
        },
        {
          "id": 4,
          "value": "Vienna"
        }
      ],

    },
    {
      "journeyId": 1005,
      "Number": "005",
      "DriverName": "Jerry",
      "Transporter": {
        "id": "T3",
        "number": "AN01020",
        "Company": "Trax"
      },
      "place": [{
          "id": 5,
          "value": "Bridgetown"
        },
        {
          "id": 6,
          "value": "Ottawa"
        }
      ],
    }
  ],
  "20180301": [{
    "journeyId": 1006,
    "Number": "005",
    "DriverName": "demy",
    "Transporter": {
      "id": "T3",
      "number": "AN01003",
      "Company": "Trax"
    },
    "place": [{
        "id": 5,
        "value": "Bridgetown"
      },
      {
        "id": 6,
        "value": "Ottawa"
      }
    ],
  }],
};

Я ожидаю такой вывод:

trips = {
    "20180201": 
        [{
           "journeyId": 1002,
            "Number": "001",
            "DriverName":"Tom",
            "Transporter": {
                "id": "T2",
                "number": "AN01002",
                "Company": "Trax"
            },
            "place": [{"id":002,"value":"Canberra" }]
                      [{"id":004,"value":"Vienna"}]
        },
        {
             "journeyId": 1003,
            "Number": "004",
            "DriverName":"Jack",
            "Transporter": {
                "id": "T3",
                "number": "AN01003",
                "Company": "Trax"
            },
            "place": [{"id":001,"value":"Washington DC" }]
                      [{"id":004,"value":"Vienna"}]
        }],
    "20180211": [{
             "journeyId": 1004,
            "Number": "005",
            "DriverName":"Jack",
            "Transporter": {
                "id": "T3",
                "number": "AN01013",
                "Company": "Trax"
            },
            "place": [{"id":005,"value":"Bridgetown" }]
                      [{"id":006,"value":"Ottawa"}]
                      [{"id":004,"value":"Vienna"}]

        },
        {
      "journeyId": 1005,
      "Number": "005",
      "DriverName": "Jerry",
      "Transporter": {
        "id": "T3",
        "number": "AN01020",
        "Company": "Trax"
      },
      "place": [{
          "id": 5,
          "value": "Bridgetown"
        },
        {
          "id": 6,
          "value": "Ottawa"
        }
       ]

};

Я пытаюсь использовать цикл for для проверки каждого элемента массива на соответствие паре ключ-значение. То, что я хочу сделать в основном, это

for (option in FilteredselectedOptions) 
{
     //logic
}

Я смог сделать это для одного конкретного значения массива:

const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
  const filtered = trips[x].filter(y => y.place && y.place.some(z => z.value === 'Vienna'));

  if (filtered.length) {
    tmp[x] = filtered;
  }

  return tmp;
}, {});

Но как мне это сделать для всех элементов массива, независимо от того, сколько элементов находится внутри массива. Пожалуйста, помогите в цикле.


  • есть ли у значений фильтра связанный ключ? 17.03.2018
  • Значения фильтра представлены в виде массива. Как сохранить их с родственным ключом? 17.03.2018
  • это был вопрос. это ваши данные, в чем логика? первое значение является ключом, но берутся не все элементы ключей, 'Trax' есть почти в каждом элементе, 'Vienna' вроде надежно, но не последняя часть 'AN01020' не найдена в результирующем наборе. так: как так? 17.03.2018
  • логика такова, что если мне нужно найти поездку, дата которой 20180211, место - Вена, transporter.company=Trax и Transporter.number=AN01020. Как лучше всего подойти? 17.03.2018
  • так у вас есть связанные ключи значений? 17.03.2018
  • @NinaScholz да, пара ключ-значение есть. Но как это сделать с помощью массива. Когда пользователь вводит случайные даты, место, номер транспортера в строке поиска, я беру значения этих параметров и сохраняю их в массиве. Поэтому мне нужно перебрать массив. 17.03.2018
  • Давайте продолжим обсуждение в чате. 17.03.2018

Ответы:


1

Просто подход, пытающийся фильтровать с поиском одного элемента в данных.

function filter(object, options) {
    const check = v => options.includes(v) || v && typeof v === 'object' && Object.keys(v).some(l => check(v[l]));
    var result = {};
    Object.keys(object).forEach(function (k) {
        var temp = options.includes(k)
            ? object[k]
            : object[k].filter(check);

        if (temp.length) {
            result[k] = temp;
        }
    });
    return result;
}

var trips = { "20180201": [{ journeyId: 1001, Number: "001", DriverName: "Alex", Transporter: { id: "T1", number: "AN01001", Company: "Tranzient" }, place: [{ id: "001", value: "Washington DC" }, { id: "002", value: "Canberra" }] }, { journeyId: 1002, Number: "001", DriverName: "Tom", Transporter: { id: "T2", number: "AN01002", Company: "Trax" }, place: [{ id: 2, value: "Canberra" }, { id: 4, value: "Vienna" }] }, { journeyId: 1003, Number: "004", DriverName: "Jack", Transporter: { id: "T3", number: "AN01003", Company: "Trax" }, place: [{ id: 1, value: "Washington DC" }, { id: 4, value: "Vienna" }] }], "20180211": [{ journeyId: 1004, Number: "005", DriverName: "Jack", Transporter: { id: "T3", number: "AN01013", Company: "Trax" }, place: [{ id: 5, value: "Bridgetown" }, { id: 6, value: "Ottawa" }, { id: 4, value: "Vienna" }] }, { journeyId: 1005, Number: "005", DriverName: "Jerry", Transporter: { id: "T3", number: "AN01020", Company: "Trax" }, place: [{ id: 5, value: "Bridgetown" }, { id: 6, value: "Ottawa" }] }], "20180301": [{ journeyId: 1006, Number: "005", DriverName: "demy", Transporter: { id: "T3", number: "AN01003", Company: "Trax" }, place: [{ id: 5, value: "Bridgetown" }, { id: 6, value: "Ottawa" }] }] },
    options = ["20180211", /* "Trax", */ "Vienna", "AN01020"];

console.log(filter(trips, options));
.as-console-wrapper { max-height: 100% !important; top: 0; }

17.03.2018

2

Можно использовать рекурсию для поиска значений в объекте:

 function hasValue(obj, values){
  for(const value of Object.values(obj)){
    if(typeof value === "object"){
       if(hasValue(value, values))
          return true;
    } else {
       if(values.includes(value))
          return true;
    }
  }
  return false;
 }

Теперь мы можем фильтровать ваши поездки, сравнивая ключи и используя функцию выше:

  const filteredTrips = Object.keys(trips).filter(key => {
    if(FilteredSelectedOptions.includes(key))
       return true;
    if(hasValue(trips[key], FilteredSelectedOptions))
       return true;
    return false;
 });
17.03.2018
  • в строке for(const value of Object.values(obj)) , ошибка: значение не существует для типа компонента. Что я пропустил? 17.03.2018
  • Ошибка: значения свойств не существуют для типа ObjectConstructor. 17.03.2018
  • Сделал это. Все равно выдает ту же ошибку. Я пропустил какую-либо библиотеку 17.03.2018
  • @UDGogs какой браузер ты используешь? 17.03.2018
  • я использую хром 17.03.2018
  • Я должен использовать this.hasValue, иначе он показывает ошибку 17.03.2018
  • @UDGogs developer.mozilla.org/en- США/документы/Интернет/JavaScript/Справочник/ 17.03.2018
  • Давайте продолжим обсуждение в чате. 17.03.2018

  • 3

    Дайте мне знать, если вам нужен полный код. Начнем с того, что объекты в javascript не имеют встроенных методов фильтрации или сокращения, они есть только у массивов. Что бы я сделал, я бы просмотрел свойства объекта, которые являются массивами, и проверил бы, имеют ли они одно из свойств, которые находятся в FilteredSelectedOptions. Если я найду его, я отправлю его в новый массив, содержащий результаты.

    17.03.2018
  • Обязательно поможет, если вы можете предоставить мне код 17.03.2018
  • Опции, представленные в массиве, могут быть любого уровня вложенности. Как правильно сортировать 17.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..