数组:使对象属性成为数组键
Array: make object property into array key
我有一个对象数组,如下所示:
arr[0] = {name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'}
arr[1] = {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}
我想要实现的是创建第二个数组,将name属性作为数组键,这样它看起来像这样:
arr2[name1] = {attribute1: 'a1Value1', attribute2: 'a2Value1'}
arr2[name2] = {attribute1: 'a1Value2', attribute2: 'a2Value2'}
有没有一种简单有效的方法来使用undercoreJS或普通JS?
我想,这就是你想要的。
这是jsbin链接。http://jsbin.com/soheni/edit?html,js,控制台,输出
var arry = [{name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'}, {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}];
function convert(arry){
var data = {};
arry.forEach(function(obj){
var nameKey = obj.name;
delete obj.name;
data[nameKey] = obj;
});
return data;
}
console.log(convert(arry));
输出:
{
name1:{
attribute1: "a1Value1",
attribute2: "a2Value1"
},
name2: {
attribute1: "a1Value2",
attribute2: "a2Value2"
}
}
如果你真的不关心结果中的name
属性,那么快速而肮脏:
var obj = arr.reduce(function(p,c) {
p[c.name] = c;
return p;
},{});
如果确实希望删除name
属性,则可以从c
中delete
它。然而,这将使原始值发生变化。如果希望原始数组仍保留name
属性,则需要复制对象(但不包含name
属性)。
所以你可以做:
var obj = arr.reduce(function(p,c) {
p[c.name] = c;
delete c.name; // note this removes it from the original array too!
return p;
},{});
或者:
var obj = arr.reduce(function(p,c) {
var cheapCopy = JSON.parse(JSON.stringify(c)); // note this is not necessarily the most
// efficient way to clone an object
delete cheapCopy.name;
p[c.name] = cheapCopy;
return p;
},{});
就我个人而言,我倾向于将name
属性保留在那里,除非有一个真正令人信服的原因(即它确实会导致性能问题,或者如果它存在,其他代码会抱怨)来删除它
这里有一种方法…
var arr = [];
arr.length = 3;
arr[0] = { name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1' };
arr[1] = { name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2' };
arr[2] = { name: 'name3', attribute1: 'a1Value3', attribute2: 'a2Value3' };
var newObj = {};
for (var i = 0; i < arr.length; i++) {
var arrObj = arr[i];
var propName = arrObj.name;
delete arrObj.name;
newObj[propName] = arrObj;
}
console.log('New Object:', newObj);
for (var key in newObj) {
console.log('New Object By Key/Value:', key, newObj[key]);
}
或者,更短。。。
var newObj = {};
arr.forEach(function(obj) {
var propName = obj.name;
delete obj.name;
newObj[propName] = obj;
});
console.log('newObj:', newObj);
您可能希望手动复制属性,或者对原始对象进行克隆复制,但我在这里并不是纯粹为了简化示例。
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象