Как проверить в JavaScript, если объект находится в массиве с несколькими объектами?

1

У меня есть массив с несколькими объектами в виде записей (коллекция), и я хочу проверить, есть ли другой объект-источник в этих объектах с одной записью. Если это так, я хочу вернуть массив со всеми объектами, которые выполняют это условие. Вот код с примером:

function whatIsInAName(collection, source) {
    var arr = [];
    var sourceEntries = Object.entries(source);
    for (var i = 0; i < collection.length; i++) {
        for (var j = 0; i < sourceEntries.length; i ++) {
            if((collection[i].hasOwnProperty(sourceEntries[j][0]))) {
                if(collection[i][sourceEntries[j][0]] == sourceEntries[j][1]) {
                    /*what happens here*/
                }
            }
        arr.push(collection[i]);
        }

    }
    return arr;
}

print(whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }));

Очевидно, я не знаю, что положить туда, где написано ("что здесь происходит"). Проблема в том, что второй для цикла и оба условия должны быть true поэтому команда push имеет смысл.

Я ценю любой намек или помощь, спасибо!

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

Теги:
object
arrays
loops

1 ответ

2
Лучший ответ

Здесь .filter функция .filter:

function whatIsInAName(collection, source) {
  return collection.filter((obj) => {
    for (var prop in source) {
      if (source[prop] !== obj[prop]) {
        // The source property is not found in obj - no good!
        return false;
      }
      // The source property matches one of the obj properties - keep going!
    }
    // Made it through the checks! You've got a match!
    return true;
  });
}

console.log(whatIsInAName([{
  "a": 1,
  "b": 2
}, {
  "a": 1
}, {
  "a": 1,
  "b": 2,
  "c": 2
}], {
  "a": 1,
  "b": 2
}));

Или, если вы склонны использовать библиотеку для этого, это можно сделать очень просто с Lodash:

var collection = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }],
    source = { "a": 1, "b": 2 };

console.log(_.filter(collection, source));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
  • 0
    Спасибо, @ j-titus Плавный и элегантный способ ее решения. Очень ценится!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню