#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. Пожалуйста, опишите, что вы изменили и почему, чтобы помочь другим определить проблему и понять этот ответ