如何从已知子对象ID的对象中检索子对象

时间:2016-07-15 10:54:28

标签: javascript

我有一个名为Suppliers的对象,其中id始终是唯一的,如下所示:

var suppliers = {
    Supplier1: {
        id: 1,
        name: 'Supplier1',
        SVGTemplate: 'svg-supplier1'
    },
    Supplier2: {
        id: 2,
        name: 'Supplier2',
        SVGTemplate: 'svg-supplier2'
    },
    Supplier3: {
        id: 3,
        name: 'Supplier3',
        SVGTemplate: 'svg-supplier3'
   }
}

当我所知道的是子对象的id时,如何返回子对象(例如返回suppliers.Supplier1)?我试图使用.filter,但这似乎只适用于数组:

function findById(source, id) {
    return source.filter(function (obj) {
        return +obj.id === +id;
    })[0];
}

var supplierarray = findById(suppliers, myKnownID);
return supplierarray;

3 个答案:

答案 0 :(得分:2)

您需要使用object循环遍历for-in,您尝试使用.filter用于数组。

因此,您可以将findById定义更改为

var suppliers = {
    Supplier1: {
        id: 1,
        name: 'Supplier1',
        SVGTemplate: 'svg-supplier1'
    },
    Supplier2: {
        id: 2,
        name: 'Supplier2',
        SVGTemplate: 'svg-supplier2'
    },
    Supplier3: {
        id: 3,
        name: 'Supplier3',
        SVGTemplate: 'svg-supplier3'
   }
}
// Should return single object not array, as id is unique as OP said 
function findById(source, id) {
   for(var key in source){
     if(source[key].id === id){
       return source[key];
     }
   }
  return null;
}

findById(suppliers,3);// {id: 3, name: "Supplier3", SVGTemplate: "svg-supplier3"}

答案 1 :(得分:0)

Object.keys(suppliers).map(key => suppliers[key]).find(({id}) => id === someId);

答案 2 :(得分:0)

您可以在其子对象中搜索任何键。

 Object.prototype.findBy = function(propName, propVal){

    for( var i in this ){

         if( this[i][ propName ] == propVal ){
            return this[i];
        }
    }
    return undefined;
};

var suppliers = {
    Supplier1: {
        id: 1,
        name: 'Supplier1',
        SVGTemplate: 'svg-supplier1'
    },
    Supplier2: {
        id: 2,
        name: 'Supplier2',
        SVGTemplate: 'svg-supplier2'
    },
    Supplier3: {
        id: 3,
        name: 'Supplier3',
        SVGTemplate: 'svg-supplier3'
   }
}

console.log(suppliers.findBy("id",1));

这里我在root对象的原型中添加了函数。