javascript найти индекс объекта в массиве 2 - PullRequest
0 голосов
/ 12 мая 2018

У меня есть 2 массива

Первый массив имеет firstname и lastname Второй массив имеет только firstname

Я буду индексировать одно имя и проверять массивы

function whereIsAlice(persons) {
  var index = 1;
  for (var i = 0; i < friends1.length; i++) {
    if (friends1[i].firstName === "Alice") {
      index = i;
      break;
    }
    if (friends2[i].firstName === "Alice") {
      index = i;
    }
  }
  return index
}
var friends1 = [{
    firstName: 'John',
    lastName: 'Gaudet'
  },
  {
    firstName: 'Lisa',
    lastName: 'Mcclanahan'
  },
  {
    firstName: 'Alice',
    lastName: 'Vore'
  }, // Alice is here, at index 2
  {
    firstName: 'Marine',
    lastName: 'Salsbury'
  },
];
var friends2 = [{
    firstName: 'Tim'
  },
  {
    firstName: 'Arthur'
  },
  {
    firstName: 'Juan'
  },
];
console.log(whereIsAlice(friends1)); //Should be 2
console.log(whereIsAlice(friends2)); // Should be -1

Выход 2 на обоих. Как я могу это исправить?

Ответы [ 5 ]

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

Некоторые из вас мутируют новый массив (array.map) из исходного массива и делают indexOf.

Другие зацикливаются с for и затем проверяют переменную index.

Тогда почему сообщество JS работает над расширением языковых конструкций, методов и т. Д.?

Я рекомендую Вам лучше погрузиться в MDN и прочитать о findIndex ?

function whereIsAlice(persons) {
  return persons.findIndex(function(person) {
    return person.firstName === 'Alice';
  });
}

var friends1 = [
  {
    firstName: 'John',
    lastName: 'Gaudet'
  },
  {
    firstName: 'Lisa',
    lastName: 'Mcclanahan'
  },
  {
    firstName: 'Alice',
    lastName: 'Vore'
  }, // Alice is here, at index 2
  {
    firstName: 'Marine',
    lastName: 'Salsbury'
  },
];

var friends2 = [
  {
    firstName: 'Tim'
  },
  {
    firstName: 'Arthur'
  },
  {
    firstName: 'Juan'
  },
];
console.log(whereIsAlice(friends1));
console.log(whereIsAlice(friends2));

В ES6 он настолько короче, что не вижу смысла создавать метод:

console.log(friends1.findIndex(friend => friend.firstName === 'Alice'));
console.log(friends2.findIndex(friend => friend.firstName === 'Alice'));
0 голосов
/ 12 мая 2018

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

function whereIsAlice(persons) {
    var index= -1;
    for(var i=0;i<persons.length;i++)
        if(persons[i].firstName==="Alice"){index=i;break;}
    return index;
}
0 голосов
/ 12 мая 2018

Проблема проста. Вы сравниваете в методе whereIsAlice всегда первый массив и второй массив, затем метод всегда находит значение и прерывание для цикла.

function whereIsAlice(names) {
    for (var i = 0; i < names.length; i++) {
        if (names[i].firstName == "Alice") {
            return i;
        } 
    }

    // When not found in above loop then return -1, not found!
    return -1;
}


var friends1 = [
    { firstName: 'John', lastName: 'Gaudet' },
    { firstName: 'Lisa', lastName: 'Mcclanahan' },
    { firstName: 'Alice', lastName: 'Vore' }, // Alice is here, at index 2
    { firstName: 'Marine', lastName: 'Salsbury' }
];
var friends2 = [
    { firstName: 'Tim' },
    { firstName: 'Arthur' },
    { firstName: 'Juan' }
];
console.log(whereIsAlice(friends1)); //Should be 2
console.log(whereIsAlice(friends2)); // Should be -1
0 голосов
/ 12 мая 2018

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

function whereIsAlice(persons) {
  return persons.map(function(e) { return e.firstName; }).indexOf('Alice');
  }

  var friends1 = [{
      firstName: 'John',
      lastName: 'Gaudet'
    },
    {
      firstName: 'Lisa',
      lastName: 'Mcclanahan'
    },
    {
      firstName: 'Alice',
      lastName: 'Vore'
    }, // Alice is here, at index 2
    {
      firstName: 'Marine',
      lastName: 'Salsbury'
    },
  ];
  var friends2 = [{
      firstName: 'Tim'
    },
    {
      firstName: 'Arthur'
    },
    {
      firstName: 'Juan'
    },
  ];
  console.log(whereIsAlice(friends1)); //Should be 2
  console.log(whereIsAlice(friends2)); // Should be -1
0 голосов
/ 12 мая 2018

Вы можете сделать это так, если хотите написать свой собственный цикл.

var friends1 = [
  { firstName: 'John', lastName: 'Gaudet' },
  { firstName: 'Lisa', lastName: 'Mcclanahan' },
  { firstName: 'Alice', lastName: 'Vore' },
  { firstName: 'Marine', lastName: 'Salsbury' },
];

var friends2 = [
  { firstName: 'Tim' },
  { firstName: 'Arthur' },
  { firstName: 'Juan' },
];

const whereIsAlice = arr => {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].firstName === 'Alice') {
      return i;
    }
  }
  return -1;
}

console.log(whereIsAlice(friends1)); //Should be 2
console.log(whereIsAlice(friends2)); // Should be -1
...