【问题标题】:Javascript - copy object using keys from array [duplicate]Javascript - 使用数组中的键复制对象[重复]
【发布时间】:2019-10-31 19:42:35
【问题描述】:

我有一个包含名字的数组。

我还有一个对象,其键与数组中的键相同。该对象还有其他键。

我想复制对象,但只包含数组中的键

const keys = ['one', 'two', 'three'];

const obj = {
	date: 'Jan',
	color: 'Red',
	one: 367,
	two: 427,
	three: 753
}

const objCopy = Object.assign({}, obj)


// I'd like this console to display
// {
//   "one": 367,
//   "two": 427,
//   "three": 753
// }

console.log(objCopy)

【问题讨论】:

标签: javascript


【解决方案1】:

这可能会对您有所帮助,您必须遍历键数组并添加从obj 抓取每个现有键才能构建新对象。这不是一个副本,它是一个带有您想要的键的新对象。

const keys = ['one', 'two', 'three'];

const obj = {
	date: 'Jan',
	color: 'Red',
	one: 367,
	two: 427,
	three: 753
}

const objCopy = {};

for (let i = 0; i < keys.length; i++) {
  objCopy[keys[i]] = obj[keys[i]];
}

console.log(objCopy)

您不需要使用任何其他花哨的方法来执行此操作,其他方法确实会减少代码行数但会降低您的性能,例如使用.reduce() 或其他Array 方法。

【讨论】:

    【解决方案2】:

    您可以在键数组上使用.reduce 来获取所需的对象。

    const keys = ['one', 'two', 'three'];
    
    const obj = {
    	date: 'Jan',
    	color: 'Red',
    	one: 367,
    	two: 427,
    	three: 753
    }
    
    const objCopy = keys.reduce((a,e) => {
      a[e] = obj[e];
      return a;
    }, {});
    
    console.log(objCopy)

    【讨论】:

      【解决方案3】:

      使用forEach 循环

      const keys = ['one', 'two', 'three'];
      
      const obj = {
      	date: 'Jan',
      	color: 'Red',
      	one: 367,
      	two: 427,
      	three: 753
      }
      var obj1={};
      keys.forEach(e=>{
      obj1[e]=obj[e]
      })
      const objCopy = Object.assign({}, obj1)
      console.log(objCopy)

      【讨论】:

        【解决方案4】:
        cont objCopy = Object.entries(obj).reduce(([key, value],acc)=>keys.includes(key)?{...acc, key:value}:acc, {}) 
        

        【讨论】:

          【解决方案5】:

          hasOwnProperty 用于排除继承的属性

          const keys = ['one', 'two', 'three'];
          
          const obj = {
            date: 'Jan',
            color: 'Red',
            one: 367,
            two: 427,
            three: 753
          }
          
          const objCopy = {}; // copy
          
          for (let property in obj) {
            if (obj.hasOwnProperty(property) && keys.find(k => k == property)) {
              objCopy[property] = obj[property];
            }
          }
          
          console.log(objCopy);

          【讨论】:

          • +1 用于检查它是否具有该属性。我建议进行编辑以在 for 循环中包含 let。我们应该在 JS 中使用 letconst 并停止使用 var
          • 首先你的代码是错误的——重复的obj声明。对于object - 如果您不需要分配另一个值,最好使用const 而不是let
          • @АленаВерещака 我解决了你的问题
          【解决方案6】:

          const keys = ['one', 'two', 'three'];
          
          const obj = {
          	date: 'Jan',
          	color: 'Red',
          	one: 367,
          	two: 427,
          	three: 753
          }
          
          const objCopy = {};
          
          keys.forEach(key => objCopy[key] = obj[key]);
          
          console.log(objCopy)

          【讨论】:

            【解决方案7】:

            试试这个:

            const obj = {
            	date: 'Jan',
            	color: 'Red',
            	one: 367,
            	two: 427,
            	three: 753
            }
            
            const extract = ({one, two, three}) =>Object.assign({},{one, two, three});
            
            console.log(extract(obj))

            【讨论】:

            • 这不是这个问题的答案。如果您需要额外的属性four,那么您需要更新多少?
            • @АленаВерещака,添加参数,({,four}),我在 ES6 中使用解构对象作为函数参数...,这是不使用任何迭代的解决方案(foreach,map ...)
            • 阿门,感谢您的回复。我认为问题的关键在于如何通过过滤包含string 键的key 数组来复制对象。谢谢
            【解决方案8】:

            很简单的reduce

            const keys = ['one', 'two', 'three'];
            
            const obj = {
              date: 'Jan',
              color: 'Red',
              one: 367,
              two: 427,
              three: 753
            };
            
            const res = keys.reduce((a, c) => (obj[c] ? a[c] = obj[c] : c, a), {});
            console.log(res);

            (三元运算符确保键实际存在于对象中 - 否则您将在结果中得到undefineds,您必须过滤掉)。

            【讨论】:

              【解决方案9】:

              可以通过以下方式获取想要的对象:

              const keys = ['one', 'two', 'three'];
              
              const obj = {
                  date: 'Jan',
                  color: 'Red',
                  one: 367,
                  two: 427,
                  three: 753
              }
              
              let desiredObject = Object.keys(obj)
                  .filter(key => keys.includes(key))
                  .map(key => {
                      return {[key]: obj[key]}
                  })
                  .reduce((a, b) => Object.assign({}, a,b));
              

              【讨论】:

                猜你喜欢
                • 2016-12-01
                • 1970-01-01
                • 2019-01-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-07-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多