Как сравнить строку со значением объекта в массиве

#javascript #arrays #javascript-objects

#javascript #массивы #javascript-объекты

Вопрос:

Я хочу проверить, соответствует ли строка другой строке в массиве объектов.

Вот мой код

 let myArr = [{title: "fruits"}, {title: "vegetables"}];
//I want to match a string with the 'title' of the objects 

var str = "string";
if ( myArr[i].title == str) {
    //Do something 
}
 

Комментарии:

1. его let нет Let , и какое значение i ?

2. Просто чтобы сделать этот спринт еще смешнее, ожидаете ли вы просто вывода «true» / «false» или индекса соответствующего элемента (ов) в массиве или самого соответствующего объекта? Вы ищете точное или частичное совпадение?

3. Все большинство ответов здесь работают отлично.

Ответ №1:

Сначала о главном. Избегайте заглавной буквы в Let myVariable is just let myVariable .
Также рассмотрите возможность использования const вместо let для тех переменных, которые не изменятся 🙂
Теперь, чтобы ответить на ваш вопрос, вы можете использовать этот some метод. Что-то вроде этого:

 const myArr = [{title: "fruits"}, {title: "vegetables"}];
const str = 'fruits';
console.log('Exist?', myArr.some((obj)=>obj.title===str));
// This will output Exist? true
 

Ответ №2:

 let myArr = [{ title: "fruits" }, { title: "vegetables" }];
var str = "string";
if (myArr.find(a => a.title == str) != null) {
    console.log('aaa');
}
 

Ответ №3:

Использование ES6

    let myArr = [{title: "fruits"}, {title: "vegetables"}];
    
    const checkTitle = obj => obj.title === 'fruits';
    
    //check if it is found
    if((myArr.some(checkTitle))){
    //do your stuff here
    console.log("it exists, yay")} 

Ответ №4:

Поскольку вы явно уже используете ES6, наиболее идиоматичным способом является использование Array.includes after map ping массива:

 let myArr = [{title: "fruits"}, {title: "vegetables"}];

var str = "string";

let match = myArr.map(obj => obj.title).includes(str);

console.log(match); 

Комментарии:

1. Вы создаете копию массива только для того, чтобы посмотреть, включен ли элемент… Я бы напрямую использовал Array.prototype.some() или Array.prototype.find() вместо этого.

2. @jo_va это справедливая критика. Но я сомневаюсь, что это имеет значение, если только вы не собираетесь использовать огромный массив (например, тысячи объектов). И я нахожу includes и map более читаемым, потому что он понятнее, что вы делаете, .some более общий, и вам нужно посмотреть на детали переданной ему функции, чтобы понять, что происходит. Конечно, в данном случае это легко, но это своего рода небольшой «ментальный налог», которого лучше избегать.

3. Я также проголосовал за «некоторое» решение, поскольку оно кажется мне более кратким и элегантным, но, как ни странно , «map includes» работает быстрее , что, конечно, не меняет моего мнения.

4. Интересно, спасибо. Я всегда немного скептически отношусь к таким тестам, но на самом деле я не так уж удивлен. Я ожидаю, что движки JS оптимизируются специально для таких вещей, как .includes — и накладные расходы на создание нового массива с map , как я уже сказал, скорее всего, становятся заметными только с гораздо большими массивами.

Ответ №5:

Вы можете использовать —

 let match = false
myArr.forEach(function(element){
    if(element.title === str){
        match = true;
    }
});
 

Ответ №6:

Вы можете просто перебирать элементы массива и сравнивать их с str.

 var myArr = [{title: "fruits"}, {title: "vegetables"}];
var str = "string";

for (i=0;i<myArr.length;i  ){
if (myArr[i].title===str){
console.log(true);
}
else {
console.log(false);

}
}
 

Ответ №7:

Я использую его в своем коде и отлично работаю со мной

var fruitsObj = myArr.find(element => element.title == "fruits")

Вы получите объект, который содержит заголовок fruits, который {title: "fruits"} в вашем случае.

Ответ №8:

Я бы использовал Array.prototype.some() или Array.prototype.find() с !! помощью before, чтобы превратить значение в логическое:

 const myArr = [ { title: 'fruits' }, { title: 'vegetables' } ];

console.log(myArr.some(({ title }) => title === 'fruits'));
console.log(!!myArr.find(({ title }) => title === 'fruits')); 

Комментарии:

1. … слишком поздно 🙂 опубликовано 6 минут назад

2. Но деструктурирующее присваивание добавляет определенный шарм

Ответ №9:

прочитайте каждый элемент заголовка массива, используя цикл for —>

 let myArr = [{title: "fruits"}, {title: "vegetables"}];

let str = "string";
for(let i=0; i < myArr.length; i  ) {
    if (myArr[i].title === str) {
          return true;
    }
}
 

Комментарии:

1. Пожалуйста, опишите, что вы изменили и почему, чтобы помочь другим определить проблему и понять этот ответ