【问题标题】:Get all object's values for keys in an array [duplicate]获取数组中键的所有对象值[重复]
【发布时间】:2020-11-11 03:35:19
【问题描述】:

我有一个这样的对象:

myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };

并且我想获取其键在以下列表中的值的列表:

myList = [1,2,10]

所以我想要的结果是:

[{name:'a'},{name:'v'}, {name:'t'}]

关于如何做到这一点的任何想法?

我尝试了以下方法:

const result = [];
        
for (const childId in state.frameObjects[id].childrenIds ) 
{
     if(state.frameObjects[childId]!==undefined)
     {
          result.push(state.frameObjects[childId]);
     }
}
        
return result;

但是 Vue 控制台给了我这个错误:InternalError: "too much recursion"

【问题讨论】:

    标签: javascript vuejs2 javascript-objects


    【解决方案1】:

    您可以将所需的密钥放入Set 并使用filter。如果数组包含对象中不存在的键,这也将起作用。

    const myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
    const keys = new Set([1,2,10])
    const res = Object.keys(myObj).filter(key=>keys.has(+key)).map(key=>myObj[key]);
    console.log(res);

    【讨论】:

      【解决方案2】:

      你可以这样做:

      var objectArray = [];
      myList.forEach(function(key){
          if(myObj[key]){ 
             objectArray.push(myObj[key]);
           }
      });
      

      【讨论】:

        【解决方案3】:

        您可以使用键迭代您的数组,并检查它们是否存在于您的myObj 中,如果它们存在,那么您可以将值推送到新的 arrya 中:

        const myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
        const myList = [1,2,10]
        const newArr = []
        myList.forEach(key => {
          if (myObj[key]) {
            newArr.push(myObj[key])
          }
        })
        
        
        console.log(newArr)

        【讨论】:

          【解决方案4】:

          您可以过滤它们对象的键,然后映射结果。

          const valuesOf = (obj, keys) => Object.keys(obj)
            .filter(key => keys.includes(parseInt(key, 10)))
            .map(key => obj[key])
          
          const myObj = { 1: { name: 'a'}, 2: { name: 'v'}, 3: { name: 'x'}, 10: { name: 't'} };
          
          console.log(valuesOf(myObj, [1, 2, 10]))
          .as-console-wrapper { top: 0; min-height: 100% }

          或者,您可以稍后尝试映射和过滤。这允许您按所需键的顺序返回对象。

          const valuesOf = (obj, keys) =>
            keys.map(key => obj[key]).filter(v => v !== undefined)
          
          const myObj = { 1: { name: 'a'}, 2: { name: 'v'}, 3: { name: 'x'}, 10: { name: 't'} };
          
          console.log(valuesOf(myObj, [1, 2, 10]))
          .as-console-wrapper { top: 0; min-height: 100% }

          【讨论】:

            【解决方案5】:

            更实用的方法是:myList.map(a => myObj[a]).filter(a => a)

            注意:.filter(a => a) 将删除 undefined

            【讨论】:

              【解决方案6】:

              这可以通过多种方式完成; 一种选择是循环遍历对象属性

              const list = [];      
              for(let prop in myObj){
                     if(myList.includes(prop)){
                         list.push(myObj[prop])
                      }
                  }
              

              使用 Object.keys() 可以达到相同的结果

               const result = Object.keys(myObj).map((x) => {
                      if (myList.includes(parseInt(x))) {
                         return myObj[x];
                      }
                  })
              

              【讨论】:

                【解决方案7】:

                试试这个

                let myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                    let objsArray = []
                    let myList = [1,2,10];
                    for (let index = 0; index < myList.length; index++) {
                       const element = myList[index];
                       objsArray.push(myObj[element])
                  
                    }
                    
                    console.log(objsArray)

                【讨论】:

                  【解决方案8】:

                  只需要map

                  var myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                  var myList = [1,2,10]
                  // var result = myList.map( function(k){ return myObj[k]; })
                  var result = myList.map( k => myObj[k])
                  
                  console.log(result);

                  如果人们说它可能不在列表中,请使用filter

                  var myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                  var myList = [1,2,10, 33, 44, 555]
                  // var result = myList.map( function(k){ return myObj[k]; }).filter(function(o) { return o; });
                  var result = myList.map( k => myObj[k]).filter(Boolean);
                  
                  console.log(result);

                  或者在一个循环中使用reduce

                  var myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                  var myList = [1,2,10, 33, 44, 555]
                  var result = myList.reduce((a, k) =>
                    (myObj[k] && a.push(myObj[k]), a), [])
                  // var result = myList.reduce(function(a, k) {
                  //  if(myObj[k]) { 
                  //     a.push(myObj[k]);
                  //   }
                  //   return a
                  // }, []);
                  console.log(result);

                  【讨论】:

                  • 如果key不存在会导致数组中undefineds
                  • 正如之前在this answer 中提到的,这并非在所有情况下都有效。
                  • 如果是这种情况,请运行过滤器......
                  【解决方案9】:

                  使用Map

                   myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                   myList = [1,2,10]
                   map= new Map(),res=[]
                   Object.entries(myObj).map(o=>map.set(o[0],o[1]))
                   myList.forEach(o=>{ v=map.get(o.toString())
                     if(v) res.push(v)})
                   console.log(res)

                  【讨论】:

                    【解决方案10】:

                    const myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                    const myList = [1,2,10];
                    
                    const result = myList?.map(key => (myObj == null ? null : myObj[key]), []) || [];
                    console.log(result);

                    【讨论】:

                      【解决方案11】:

                      这是你想要的:

                      const myObj = { 1:{name:'a'}, 2:{name:'v'}, 3:{name:'x'}, 10:{name:'t'} };
                      
                      const myList = [1,2,10];
                      
                      const res = Object.entries(myObj).filter(([k,v])=>{
                        return myList.includes(+k);
                      }).map(([k,v])=>{
                        return v;
                      })
                      console.log(res);//[{name:'a'},{name:'v'}, {name:'t'}]

                      【讨论】:

                        猜你喜欢
                        • 2018-10-03
                        • 1970-01-01
                        • 2019-05-17
                        • 1970-01-01
                        • 2016-06-03
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多