Pregunta Buscar por clave en un objeto anidado


Digamos que tengo un objeto:

[
    {
        'title': "some title"
        'channel_id':'123we'
        'options': [
                    {
                'channel_id':'abc'
                'image':'http://asdasd.com/all-inclusive-block-img.jpg'
                'title':'All-Inclusive'
                'options':[
                    {
                        'channel_id':'dsa2'
                        'title':'Some Recommends'
                        'options':[
                            {
                                'image':'http://www.asdasd.com'                                 'title':'Sandals'
                                'id':'1'
                                'content':{
                                     ...

Quiero encontrar el objeto donde el ID es 1. ¿Hay alguna función para algo como esto? Podría usar Underwriters _.filter método, pero tendría que comenzar en la parte superior y filtrar hacia abajo.


40
2018-03-20 12:25


origen


Respuestas:


Recursion es tu amigo Actualicé la función para tener en cuenta las matrices de propiedades:

function getObject(theObject) {
    var result = null;
    if(theObject instanceof Array) {
        for(var i = 0; i < theObject.length; i++) {
            result = getObject(theObject[i]);
            if (result) {
                break;
            }   
        }
    }
    else
    {
        for(var prop in theObject) {
            console.log(prop + ': ' + theObject[prop]);
            if(prop == 'id') {
                if(theObject[prop] == 1) {
                    return theObject;
                }
            }
            if(theObject[prop] instanceof Object || theObject[prop] instanceof Array) {
                result = getObject(theObject[prop]);
                if (result) {
                    break;
                }
            } 
        }
    }
    return result;
}

jsFiddle actualizado: http://jsfiddle.net/FM3qu/7/


52
2018-03-20 13:02



Si desea obtener el primer elemento cuyo id es 1 mientras se busca el objeto, puede usar esta función:

function customFilter(object){
    if(object.hasOwnProperty('id') && object["id"]==1)
        return object;

    for(var i=0;i<Object.keys(object).length;i++){
        if(typeof object[Object.keys(object)[i]]=="object"){
            o=customFilter(object[Object.keys(object)[i]]);
            if(o!=null)
                return o;
        }
    }

    return null;
}

Si desea obtener todos los elementos cuyo id es 1, entonces (todos los elementos cuyo id es 1 se almacenan en el resultado como se ve):

function customFilter(object,result){
    if(object.hasOwnProperty('id') && object.id=1)
        result.push(object);

    for(var i=0;i<Object.keys(object).length;i++){
        if(typeof object[Object.keys(object)[i]]=="object"){
            customFilter(object[Object.keys(object)[i]],result);
        }
    }
}

8
2018-03-20 12:34



Encontré esta página a través de Google para las funcionalidades similares. Basado en el trabajo proporcionado por Zach y regularmike, creé otra versión que se adapta a mis necesidades.
Por cierto, teriffic trabajo Zah y regularmike! Publicaré el código aquí:

function findObjects(obj, targetProp, targetValue, finalResults) {

  function getObject(theObject) {
    let result = null;
    if (theObject instanceof Array) {
      for (let i = 0; i < theObject.length; i++) {
        getObject(theObject[i]);
      }
    }
    else {
      for (let prop in theObject) {
        if(theObject.hasOwnProperty(prop)){
          console.log(prop + ': ' + theObject[prop]);
          if (prop === targetProp) {
            console.log('--found id');
            if (theObject[prop] === targetValue) {
              console.log('----found porop', prop, ', ', theObject[prop]);
              finalResults.push(theObject);
            }
          }
          if (theObject[prop] instanceof Object || theObject[prop] instanceof Array){
            getObject(theObject[prop]);
          }
        }
      }
    }
  }

  getObject(obj);

}

Lo que hace es encontrar cualquier objeto dentro de obj con el nombre y el valor de propiedad que coinciden con targetProp y targetValue y lo empujará a la finalResults formación. Y aquí está el jsfiddle para jugar: https://jsfiddle.net/alexQch/5u6q2ybc/


3
2018-03-27 14:10



Creé la biblioteca para este propósito: https://github.com/dominik791/obj-traverse

Puedes usar findFirst() método como este:

var foundObject = findFirst(rootObject, 'options', { 'id': '1' });

Y ahora foundObject variable almacena una referencia al objeto que estás buscando.


1
2018-02-14 12:51



Si ya está utilizando Underscore, use _.find ()

_.find(yourList, function (item) {
    return item.id === 1;
});

-9
2018-03-20 12:41