我希望改变一些数据的结构。以下是我收到的数据样本
.window_handles(function(result) { // Since two windows are open we need to get the window ids
var temp = result.value[0]; //
this.switchWindow(temp); // and switch focus to the new window so that the next command is run against it
}) //
我需要做的是将其转换为具有以下格式的数组:
{
ID1: {
firstName: 'John',
lastName: 'Doe'
},
ID2: {
firstName: 'Jane',
lastName: 'Doe'
}
}
如果可能,我更喜欢使用lodash
答案 0 :(得分:5)
使用 Object.keys()
和 Array#map()
。 Object.keys()
有助于将对象的所有属性作为数组获取。然后 Array#map()
可用于迭代元素并根据返回的元素生成新数组。
var data = {
ID1: {
firstName: 'John',
lastName: 'Doe'
},
ID2: {
firstName: 'Jane',
lastName: 'Doe'
}
};
var res = Object.keys(data) // get all object properties as an array
.map(function(k) { // iterate and generate new array with custom element
return { // generate custom array object based on the property and object and return
ID: k, // k is property of ov=bjeck
firstName: data[k].firstName, // get inner properties from data object using k
larstName: data[k].lastName
};
})
console.log(res);
更新:
我创建了新对象而不是更新原始对象并返回它。如果更新原始对象不是问题,则向对象添加其他属性,并在 Array#map()
回调函数内返回引用。如果有任何数量的内部属性但它更新原始对象,则此方法有效。
var data = {
ID1: {
firstName: 'John',
lastName: 'Doe'
},
ID2: {
firstName: 'Jane',
lastName: 'Doe'
}
};
var res = Object.keys(data) // get all object properties as an array
.map(function(k) { // iterate and generate new array with custom element
data[k].ID = k; // add additional property
return data[k]; // return the reference
})
console.log(res);
或者如果你想维护对象并且有很多内部对象属性,那就做类似的事情。
var data = {
ID1: {
firstName: 'John',
lastName: 'Doe'
},
ID2: {
firstName: 'Jane',
lastName: 'Doe'
}
};
var res = Object.keys(data) // get all object properties as an array
.map(function(k) { // iterate and generate new array with custom element
var obj = { // create an object to return
ID: k
};
for (var key in data[k]) // iterate over object property
if (data[k].hasOwnProperty(key)) // check the object has the property
obj[key] = data[k][key]; // add property to the newly generated object
return obj; // return the object
})
console.log(res);
答案 1 :(得分:2)
您可以在对象中添加ID吗?如果是这样,那么可以通过以下方式轻松实现:
var arr = _.values(obj);
说明:
开发人员经常复制键内部值以避免许多问题。他们喜欢这样:
{
ID1: {
ID: ID1,
firstName: 'John',
lastName: 'Doe'
},
ID2: {
ID: ID2
firstName: 'Jane',
lastName: 'Doe'
}
}
然后只使用上面的一个命令,它只返回对象的值并创建一个数组。
如果它不适合您,那么您需要手动添加ID:
var arr = _.map(obj, function(value, key) {
value[ID] = key;
return value;
});
请注意,代码会更改原始对象,但在大多数情况下,这不是问题,但如果您需要避免这种情况,则需要:
var arr = _(obj)
.clone()
.map(obj, function(value, key) {
value[ID] = key;
return value;
})
.value();
答案 2 :(得分:0)
您可以使用map()将对象转换为数组,然后使用assign()附加ID
键值,这也可以确保原始对象无法获取突变。
以下是ES6版本:
var result = _.map(data, (item, ID) => _.assign({ ID }, item));
var data = {
ID1: {
firstName: 'John',
lastName: 'Doe'
},
ID2: {
firstName: 'Jane',
lastName: 'Doe'
}
};
var result = _.map(data, (item, ID) => _.assign({ ID }, item));
console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>
&#13;
这是es5版本:
var result = _.map(data, function(item, ID) {
return _.assign({ ID: ID }, item);
});