Избежание вложенного цикла без использования методов массива - PullRequest
3 голосов
/ 15 мая 2019

Скажем, у меня есть два массива объектов.Например,

var name = [
    { name : 'john' },
    { name : 'doe' }
]
var name2 = [
    { name : 'john' },
    { name : 'does' }
]

И я хочу проверить, совпадает ли имя в первом массиве с именем во втором массиве, и вернуть ответ.Я сделаю это ниже

for(var i = 0; i < name.length; i++) {
    for(var j = 0; j < name2.length; j++) {
        if(name[i].name === name2[j].name) {
            console.log('good')
        } else {
            console.log('bad');
        }
    }
}

Приведенный выше код даст следующий результат

good
bad 
bad
bad

Как получить тот же результат без использования вложенного цикла for?

Я пытался использовать forEach для циклического прохождения сразу.Как

name.forEach(function(value, index) {
    if(value.name === name2[index].name) {
        console.log('good');
    }
    console.log('bad')
});

Но это не работает и создает проблемы, когда они являются массивами различной длины.

Все мои исследования приводят к использованию filter, map, reduce... методы.Я хочу добиться этого, используя только for петли.Спасибо.

Ответы [ 4 ]

2 голосов
/ 15 мая 2019

С

Я пытался использовать forEach.Но это не работает и создает проблемы, когда они являются массивами различной длины.

Я полагаю, вы хотите сравнить оба массива независимо от длины.Таким образом, вы можете получить максимальную длину из 2 массивов, используя Math.max.Затем выполните цикл и проверьте, имеют ли 2 массива одинаковое значение для каждого индекса

Условие name1[i] && name2[i] проверяет наличие undefined, когда меньший массив не имеет значения по указанному индексу.

var name1 = [
    { name : 'john' },
    { name : 'doe' }
]
var name2 = [
    { name : 'john' },
    { name : 'does' },
    { name : 'jane' }
]

var maxLength = Math.max(name1.length, name2.length);

for (var i = 0; i < maxLength; i++) {
  if (name1[i] && name2[i] && name1[i].name === name2[i].name)
    console.log("good")
  else
    console.log("bad")
}
1 голос
/ 15 мая 2019

Вы можете попробовать следующий код:

var arr = [
    { name : 'john' },
    { name : 'doe' }
]
var arr2 = [
    { name : 'john' },
    { name : 'peter' },
    { name : 'doe' }
]

var i = 0, length = Math.min(arr.length, arr2.length);

for(i; i < length; i++) {
    if(arr[i].name === arr2[i].name) {
            console.log('good')
        } else {
            console.log('bad');
     }
}
0 голосов
/ 15 мая 2019

Другое решение, использующее функцию map для избежания использования вложенных циклов. Не уверен, что он отвечает на весь вопрос, но надеюсь, что это поможет.

//var search_value = 'john'; // will print 'good'
var search_value = 'doe'; // will print 'bad'

var name1 = [
    { name : 'john' },
    { name : 'doe' }
];

var name2 = [
    { name : 'john' },
    { name : 'does' }
];

var pos1 = name1.map(function(element) { return element.name; }).indexOf(search_value);
var pos2 = name2.map(function(element) { return element.name; }).indexOf(search_value);

var result = (pos1 == pos2) ? 'good' : 'bad';
console.log(result)
0 голосов
/ 15 мая 2019

Вам не нужно иметь 2 петли.Вы можете сделать следующее: отобразить этот массив в объект, иметь такую ​​структуру для обоих массивов:

// first array
{
"jhon": 1, //count how many names u have in each array
"otherName": 1
}

// second array
{
"jhon": 1, //count how many names u have in each array
"otherName": 1
}

, а затем просто сравнить эти 2 массива.Гораздо быстрее и чище имо.

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