代码之家  ›  专栏  ›  技术社区  ›  Bilal Zafar

通过给定键从key,val对象中查找值

  •  2
  • Bilal Zafar  · 技术社区  · 8 年前

    我试图通过给键,从对象的键,值对中找到值。 钥匙在数组中。

    var arr = ["1398","1392","1390"];
    var objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    

    我需要从键位于数组中的对象中查找所有值。我该怎么做? 到目前为止,我做到了:

    for (var a=0; a<arr.length;a++) {
        console.log(arr[a]);
    }
    
    for (var k in objects){
        if (typeof objects[k] !== 'function') {
             console.log(k + ", " + objects[k]);
        }
    }
    
    6 回复  |  直到 8 年前
        1
  •  3
  •   Eddie    8 年前

    您可以通过以下方式找到值: objects[ arr[ 0 ] ] 将返回 systemConfiguration

    哪里 0 , 1 和 2 是 arr


    您可以循环查找所有内容。例如:

    var arr = ["1398", "1392", "1390"];
    var objects = {
      1384: "registerItem",
      1386: "createGroups",
      1388: "vipNumbers",
      1390: "targetNumbers",
      1392: "ignoredNumbers",
      1394: "globalConstants",
      1396: "Users",
      1398: "systemConfiguration",
      1400: "applicationErrors"
    };
    
    for (var key in arr) {
      if( typeof objects[arr[key]] != 'undefined' ) console.log(objects[arr[key]]);
    }
        2
  •  2
  •   Kishore Kumar    8 年前

    您可以使用 underscore.js 选取方法。

    var arr = ["1398","1392","1390"];
    var objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    
    console.log(_.pick(objects,arr))
    
    //For Values
    console.log(_.chain(objects).pick(arr).values().value());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
        3
  •  1
  •   Amani Ben Azzouz    8 年前

    可以循环数组,然后检查当前索引是否在对象中:

    var objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    var arr = ["1398","1392","1390"];
    arr.forEach(function(entry) {
        if(entry in objects) console.log(objects[entry]);
    });
        4
  •  1
  •   Mihai Alexandru-Ionut    8 年前

    我该怎么做?

    只需使用 map 通过传递 callback 作用

    var arr = ["1398", "1392", "1390"];
    var objects = {
      1384: "registerItem",
      1386: "createGroups",
      1388: "vipNumbers",
      1390: "targetNumbers",
      1392: "ignoredNumbers",
      1394: "globalConstants",
      1396: "Users",
      1398: "systemConfiguration",
      1400: "applicationErrors"
    };
    
    console.log(arr.map(a => objects[a]));
        5
  •  1
  •   T.J. Crowder    8 年前

    我需要从键位于数组中的对象中查找所有值。

    在ES5环境中,我可能会使用 forEach 和 push ,正在检查 in 或 hasOwnProperty (取决于您是否要检查原型)以查看对象是否具有键:

    var arr = ["1398","1392","1390"];
    var objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    var values = [];
    arr.forEach(function(key) {
        if (key in objects) {
            values.push(objects[key]);
        }
    });
    console.log(values);

    在ES2015+环境中,我可能会使用 for-of 而不是 :

    const arr = ["1398","1392","1390"];
    const objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    const values = [];
    for (const key of arr) {
        if (key in objects) {
            values.push(objects[key]);
        }
    }
    console.log(values);

    最后,如果你 已经知道了 对象包含属性,完全不需要检查,您可以使用 map :

    var arr = ["1398","1392","1390"];
    var objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    var values = arr.map(function(key) {
        return objects[key];
    });
    console.log(values);

    ...在ES2015+中,可以使用简明箭头功能:

    const arr = ["1398","1392","1390"];
    const objects = { 1384: "registerItem", 1386: "createGroups", 1388: "vipNumbers", 1390: "targetNumbers", 1392: "ignoredNumbers", 1394: "globalConstants", 1396: "Users", 1398: "systemConfiguration", 1400: "applicationErrors" };
    const values = arr.map(key => objects[key]);
    console.log(values);
        6
  •  1
  •   Koushik Chatterjee    8 年前

    尝试减少数组,然后创建一个新对象 {} 然后拿着 key,value 为对象中存在的键配对,或创建新数组 []

    arr.reduce(function(init, key) {
        if(objects[key]) { init[key] = objects[key]; };
        return init;
    }, {});
    

    或

    arr.reduce(function(init, key) {
            if(objects[key]) { init.push(objects[key]); };
            return init;
    }, []);
    

    和使用 underscore 或 lodash 最好从数组端进行迭代,并将对象用作映射,而不是从对象端进行迭代

    _(arr).map(k=>objects[k]).compact().value()