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

добавить свойство в массив элементов на основе набора совпадений в реквизитах — es6

У меня есть следующий массив объектов:

 arr = [
   {
      connectors:[
         {source: "aaaa", target: "bbbb"}
         {source: "bbbb", target: "2222"}
         {source: "aaaa", target: "cccc"}
         {source: "cccc", target: "1111"}
      ],
      connections: [
         {name: "aaaa", id: "11", type: "main"}
         {name: "bbbb", id: "22", type: "submain"}
         {name: "2222", id: "33", type: "supersubmain"}
         {name: "cccc", id: "44", type: "submain"}
         {name: "1111", id: "55", type: "supersubmain"}
      ]
   }
]

Мне нужно добавить в массив дополнительное свойство, основанное на сопоставлении пар ключ-значение с массивом коннекторов.

Условие в основном будет if(connectors.source === connections.name && connections.type === 'main'), тогда мне нужно добавить свойство подключения к массиву соединителей, как показано ниже.

Я хочу следующий вывод:

 arr = [
       {
          connectors:[
             {source: "aaaa", target: "bbbb", connect: true}
             {source: "bbbb", target: "2222", connect: false}
             {source: "aaaa", target: "cccc", connect: true}
             {source: "cccc", target: "1111", connect: false}
          ],
          connections: [
             {name: "aaaa", id: "11", type: "main"}
             {name: "bbbb", id: "22", type: "submain"}
             {name: "2222", id: "33", type: "supersubmain"}
             {name: "cccc", id: "44", type: "submain"}
             {name: "1111", id: "55", type: "supersubmain"}
          ]
       }
    ]

Я пытался использовать комбинацию различных функций es6, таких как карта, фильтр, распространяемый, но не могу найти подходящее решение.

Заранее спасибо.


Ответы:


1

Вы можете использовать forEach() для зацикливания каждого объекта и some для проверки условия и добавления значения connect.

var arr = [{"connectors":[{"source":"aaaa","target":"bbbb"},{"source":"bbbb","target":"2222"},{"source":"aaaa","target":"cccc"},{"source":"cccc","target":"1111"}],"connections":[{"name":"aaaa","id":"11","type":"main"},{"name":"bbbb","id":"22","type":"submain"},{"name":"2222","id":"33","type":"supersubmain"},{"name":"cccc","id":"44","type":"submain"},{"name":"1111","id":"55","type":"supersubmain"}]}]

arr.forEach(function(c) {
  c.connectors.forEach(function(a) {
    var connect = c.connections.some(function(e) {
      return e.name == a.source && e.type == 'main'
    })
    a.connect = connect;
  })
})


console.log(arr)

19.10.2017
  • + для некоторых... На мой взгляд, используется недостаточно. 19.10.2017
  • Я должен сказать, что у этого подхода есть один недостаток: он будет перебирать все элементы массива c.connections, если не найдет e.type == 'main'. Последовательность номеров внутренних итераций будет 1, 5, 1, 5, а после некоторой оптимизации может быть 1, 2, 1, 4 19.10.2017
  • Предполагается, что может быть несколько элементов с одинаковым именем и разным типом. 19.10.2017

  • 2

    С функциями Array.forEach() и Array.some():

    var arr = [{"connectors":[{"source":"aaaa","target":"bbbb"},{"source":"bbbb","target":"2222"},{"source":"aaaa","target":"cccc"},{"source":"cccc","target":"1111"}],"connections":[{"name":"aaaa","id":"11","type":"main"},{"name":"bbbb","id":"22","type":"submain"},{"name":"2222","id":"33","type":"supersubmain"},{"name":"cccc","id":"44","type":"submain"},{"name":"1111","id":"55","type":"supersubmain"}]}],
        curr_obj;   // auxiliary stub(for matched object)
    
    arr[0].connectors.forEach(function(o){
        o['connect'] = arr[0].connections.some(function(i){
            curr_obj = i;
            return i.name === o.source;
        }) && curr_obj.type == "main";
    });
    
    console.log(arr);

    19.10.2017

    3

    Попробуйте комбинацию методов .forEach() и .some():

    arr[0].connectors.forEach(c => Object.assign(c, {
      connect: arr[0].connections.some(i => i.name === c.source && i.type === 'main')
    }));
    

    Или с .map() и оператором распространения (требуется присвоение arr[0].connectors = ...):

    arr[0].connectors = arr[0].connectors.map(c => ({...c,
      connect: arr[0].connections.some(i => i.name === c.source && i.type === 'main')
    }));
    
    19.10.2017

    4

    Попробуйте следующее:

    arr[0].connectors.forEach(connector => {
        // If it can find a connection meeting the criteria then set connect to true
        if(arr[0].connections.some(connection => connection.name == connection.source && connection.type == 'main')){
            connector.connect = true;
        }
        else{
            connector.connect = false;
        }
    });
    
    19.10.2017
    Новые материалы

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

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

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

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

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

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

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