использование _.each для поиска объекта в массиве

#javascript #underscore.js

#javascript #underscore.js

Вопрос:

У меня есть массив, который выглядит следующим образом —

      list = [{"doc":{"id": "123", "name":"abc"}}, {"doc":{"id": "345", "name":"xyz"}},{"doc":{"id": "123", "name":"str"}}]
  

Как я могу использовать метод _.each для извлечения объекта doc с id =»123″? Любая помощь приветствуется.

Приветствия!

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

1. _.each из Underscore.js , не из jQuery…

Ответ №1:

На самом деле, _.detect была бы более подходящей функцией для решения этой проблемы:

 var list = [
    {"doc":{"id": "123", "name":"abc"}},
    {"doc":{"id": "345", "name":"xyz"}},
    {"doc":{"id": "123", "name":"str"}}
];

_.detect(list, function (obj) {return obj.doc.id === "123"});
  

Результат:

 {"doc":{"id": "123", "name":"abc"}}
  

В качестве альтернативы, если вы хотите вернуть оба объекта с id = ‘123’ , вы можете заменить _.detect на _.select .

 _.select(list, function (obj) {return obj.doc.id === "123"});
  

Результат:

 [{"doc":{"id": "123", "name":"abc"}}, {"doc":{"id": "123", "name":"str"}}]
  

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

1. Отличный ответ! Отлично справляется с задачей!

2. Что, если вы хотите, чтобы вместо возвращаемого объекта возвращался индекс?

Ответ №2:

Прочитайте о том, как работает jQuery.каждый обрабатывает разрыв;

 var object_with_id_123;
$.each(list, function(key, val){
  if (val.doc.id == "123") {
    object_with_id_123 = val;
    return false; // break;
  }

  return true; // continue; - just to satisfy jsLint
});
console.log(object_with_id_123);
  

Ответ №3:

 var list = [{"doc":{"id": "123", "name":"abc"}}, {"doc":{"id": "345", "name":"xyz"}},{"doc":{"id": "123", "name":"str"}}]

var olist = [];
$.each(list,function(key, value){
    if(value.doc.id =="123"){
        olist.push(value);
    }

})

    $.each(olist,function(key, value){
                alert(JSON.stringify(value))


})
  

Ответ №4:

поскольку у вас есть 2 результата с идентификатором 123, я добавил результат массива. Если у вас есть 1 результат, вы можете вернуть obj.doc вместо того, чтобы добавлять его в результат

 var result = [];
$.each(list, function(index, obj) { 
    if(obj.doc.id == 123) {
        result.push(obj.doc);
    }
});