简体   繁体   English

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

[英]How to Retrieve a sub-object from an object where the ID of the sub-object is known

I have an object called Suppliers where the id is always unique as follows: 我有一个名为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'
   }
}

How can I return the sub-object (eg return suppliers.Supplier1) when all I know is the id of the sub object? 当我所知道的只是子对象的ID时,如何返回子对象(例如,return Suppliers.Supplier1)? I tried to use .filter, but that only seems to work on arrays: 我尝试使用.filter,但是这似乎只适用于数组:

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

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

You need to loop over the object using for-in loop, you tried to use .filter which is for array. 您需要使用for-in循环遍历object ,您尝试使用用于数组的.filter

So you can change findById definition to below 因此,您可以将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"}
Object.keys(suppliers).map(key => suppliers[key]).find(({id}) => id === someId);

You can search for any key in its child objects. 您可以在其子对象中搜索任何键。

 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));

Here i've added function inside prototype of root Object. 在这里,我在根对象的原型内添加了功能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM