Используйте Lodash, чтобы найти объекты в массиве, совпадающем с идентификатором (сложный, развернутый) - PullRequest
0 голосов
/ 15 мая 2018

У меня есть набор идентификаторов.

let ids = ["5ae03c56dc0e82410d2746d7", "5ae05bf146e0fbeeb1869d7b", "5ae03c56dc0e82fd2f2746d6", "5ae04788c9e77cb0a03b3228", "5adefec246e0fb1c23f5ba6b", "5ae8498edc0e82c7cbad5026", "5ae84b4fc9e77c5db6fbf3f8"]

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

{  
    "interactions":[  
        {  
            "author":{  
                "id":"10158567383880542",
                "name":"Stephen Wilson"
            },
            "meta":{  
                "tags":[  
                    {  
                        "id":"5ae04788c9e77cb0a03b3228"
                    },
                    {  
                        "id":"5ae04788c9e77cb0a03b365"
                    }
                ]
            }
        }
    ]
}

Внутри массива взаимодействий есть несколько объектов. Есть свойство, называемое «мета», внутри мета есть свойство типа «массив», называемое «теги».

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

 let matches = _(interactions)
            .keyBy('meta.tags.id')
            .at(ids)
            .value();

Проблема с этой попыткой заключается в том, что meta.tags является массивом.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Фильтр достаточно.Нет необходимости в библиотеке

const ids = ["5ae03c56dc0e82410d2746d7", "5ae05bf146e0fbeeb1869d7b", "5ae03c56dc0e82fd2f2746d6", "5ae04788c9e77cb0a03b3228", "5adefec246e0fb1c23f5ba6b", "5ae8498edc0e82c7cbad5026", "5ae84b4fc9e77c5db6fbf3f8"]

const inter = { "interactions":[ 
  { "author":{ "id":"10158567383880542", "name":"Stephen Wilson 1" }, "meta":{ "tags":[ { "id":"5ae04788c9e77cb0a03b3228" }, { "id":"5ae04788c9e77cb0a03b365" } ] } }, 
  { "author":{ "id":"10158567383880542", "name":"Stephen Wilson 2" }, "meta":{ "tags":[ { "id":"xxx" }, { "id":"yyy" } ] } }, 
  { "author":{ "id":"10158567383880542", "name":"Stephen Wilson 3" }, "meta":{ "tags":[ { "id":"5ae03c56dc0e82fd2f2746d6" }, { "id":"5ae84b4fc9e77c5db6fbf3f8" } 

] } } ] } 


let found = [];
inter.interactions.forEach(function(act,index) {
  let actFound = act.meta.tags.filter(function(item) { return ids.indexOf(item.id) !=-1 });
  if (actFound.length>0) found = found.concat(inter.interactions[index]); // or use ...spread
})  
console.log(found)
0 голосов
/ 15 мая 2018

Вы можете объединить Array.prototype.filter () , Array.prototype.some () и Array.prototype.includes ()

Код:

const ids = ["5ae05bf146e0fbeeb1869d7b", "5ae03c56dc0e82fd2f2746d6"]
const data = {"interactions":[{"author":{"id":"10158567383880542","name":"Stephen Wilson"},"meta":{"tags":[{"id":"5ae04788c9e77cb0a03b3228"},{"id":"5ae04788c9e77cb0a03b365"}]}},{"author":{"id":"10158567383880543","name":"Phil Murray"},"meta":{"tags":[{"id":"5ae05bf146e0fbeeb1869d7b"},{"id":"5ae04788c9e77cb0a03b369"}]}},{"author":{"id":"10158567383880543","name":"Steve Jobs"},"meta":{"tags":[{"id":"5ae84b4fc9e77c5db6fbf3f8"},{"id":"5ae04788c9e77cb0a44469"}]}},{"author":{"id":"10158567383880543","name":"John Connor"},"meta":{"tags":[{"id":"5ae84b4fc9e778c5db6fbf3f8"},{"id":"5ae04788c94577cb0a44469"}]}}]};

const result = data.interactions.filter(i => i.meta.tags.some(t => ids.includes(t.id)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 15 мая 2018

Нет необходимости в отдельной библиотеке. Вы можете использовать прямую фильтрацию и отображение JavaScript здесь:

const ids = ["5ae03c56dc0e82410d2746d7", "5ae05bf146e0fbeeb1869d7b", "5ae03c56dc0e82fd2f2746d6", "5ae04788c9e77cb0a03b3228", "5adefec246e0fb1c23f5ba6b", "5ae8498edc0e82c7cbad5026", "5ae84b4fc9e77c5db6fbf3f8"]
const inters = {
  "interactions": [{
      "author": {
        "id": "10158567383880542",
        "name": "Stephen Wilson"
      },
      "meta": {
        "tags": [{
          "id": "5ae04788c9e77cb0a03b3228"
        }, {
          "id": "5ae04788c9e77cb0a03b365"
        }]
      }
    },
    {
      "author": {
        "id": "10158567383880543",
        "name": "Phil Murray"
      },
      "meta": {
        "tags": [{
          "id": "5ae05bf146e0fb345eeb1869d7b"
        }, {
          "id": "5ae04788c9e3477cb0a03b369"
        }]
      }
    },
    {
      "author": {
        "id": "10158567383880543",
        "name": "Steve Jobs"
      },
      "meta": {
        "tags": [{
          "id": "5ae8498edc0e82c7cbad5026"
        }, {
          "id": "5ae84b4fc9e77c5db6fbf3f8"
        }]
      }
    },
    {
      "author": {
        "id": "10158567383880543",
        "name": "John Connor"
      },
      "meta": {
        "tags": [{
          "id": "5ae8498edc0e82c7cbad5026"
        }, {
          "id": "5ae84b4fc9e77c5db6fbf3f8"
        }]
      }
    }
  ]
};

const matching = ids
  .map(
    id => inters.interactions.filter(interaction => interaction.meta.tags.some(tag => tag.id === id))
  )
  .filter(item => item.length > 0)
  .reduce((flattened, item) => {
    return flattened.concat(item);
  }, []);
console.log(matching);
...