如何克隆一个对象,但只有一些键/值?

时间:2016-01-25 07:19:07

标签: javascript underscore.js lodash

我有一个看起来像这样的对象:

{
  createdAt: "2016-01-25T04:01:53.282Z"
  index: 0
  objectId: "56a59e31a633bd0257868cb8"
  panoDataRotate: 0
  roomModelId: "56a59e242e958a00596a897c"
  x: 240
  y: 230
}

我想将它克隆到一个只有索引, x , and y`的对象中:

{
  index: 0
  x: 240
  y: 230
}

如何使用lodash / Underscore做到这一点?

2 个答案:

答案 0 :(得分:4)

使用lodash,你可以使用它:

var obj = {
  createdAt: "2016-01-25T04:01:53.282Z",
  index: 0,
  objectId: "56a59e31a633bd0257868cb8",
  panoDataRotate: 0,
  roomModelId: "56a59e242e958a00596a897c",
  x: 240,
  y: 230
};
var newObject = _.pick(obj, ['index', 'x', 'y']);

请参阅here _.pick()功能的文档。

一个简单的JavaScript解决方案:

var obj = {
  createdAt: "2016-01-25T04:01:53.282Z",
  index: 0,
  objectId: "56a59e31a633bd0257868cb8",
  panoDataRotate: 0,
  roomModelId: "56a59e242e958a00596a897c",
  x: 240,
  y: 230
};
var newObject = ['index', 'x', 'y'].reduce(function(result, key) {
  result[key] = obj[key];
  return result;
}, {});

答案 1 :(得分:1)

for-in on data

您可以使用for-in循环对象的属性。

var data = {
  createdAt: "2016-01-25T04:01:53.282Z",
  index: 0,
  objectId: "56a59e31a633bd0257868cb8",
  panoDataRotate: 0,
  roomModelId: "56a59e242e958a00596a897c",
  x: 240,
  y: 230
}

var allowedKeys = ["x", "y", "index"];
var result = {};
for (var key in data){
  if(allowedKeys.indexOf(key)>-1){
    result[key] = data[key];
  }
}

console.log(result)

forEach over allowedKeys array

您还可以循环使用允许的键数组来减少代码。

注意: 在此方法中,如果data中没有密钥,则会为其分配undefined。但在先前的方法中,将插入此密钥。

出于演示目的,我向test数组添加了一个键allowedKeys

var data = {
  createdAt: "2016-01-25T04:01:53.282Z",
  index: 0,
  objectId: "56a59e31a633bd0257868cb8",
  panoDataRotate: 0,
  roomModelId: "56a59e242e958a00596a897c",
  x: 240,
  y: 230
}

var allowedKeys = ["x", "y", "index", "test"];
var result = {};
allowedKeys.forEach(function(key){
  result[key] = data[key];
})

console.log(result)