javascript中数组的排序索引
我正在尝试在javascript中数组的排序索引,javascript,vue.js,ecmascript-6,vuejs2,Javascript,Vue.js,Ecmascript 6,Vuejs2,我正在尝试在Vuejs上构建一个小应用程序,其中我有一组数组,通过api响应生成,该数组提供以下输出: { "data": { "Real Estate Regulatory Act":[ { "id":603, "project_id":2392, "parent_type":"Real Estate Regulatory Act",
Vuejs
上构建一个小应用程序,其中我有一组数组,通过api响应生成,该数组提供以下输出:
{
"data":
{
"Real Estate Regulatory Act":[
{
"id":603,
"project_id":2392,
"parent_type":"Real Estate Regulatory Act",
"type":"Building Plan Approval",
"name":"FORMS.pdf",
"link":"https://.....DyumatHotelsFORMS.pdf"
}
],
"Environmental Clearance":[
{
"id":602,
"project_id":2392,
"parent_type":"Environmental Clearance",
"type":"Form 1",
"name":"HotelsCPEMP.pdf",
"link":"https://.....MarineandDyumatHotelsCPEMP.pdf"
}
],
"Document":[
{
"id":601,
"project_id":2392,
"parent_type":"Document",
"type":"Land Details",
"name":"FORMS.pdf",
"link":"https://....HotelsFORMS.pdf"
}
],
"Miscellaneous Approvals":[
{
"id":604,
"project_id":2392,
"parent_type":
"Miscellaneous Approvals",
"type":"Not Reported",
"name":"Report Part 1.pdf",
"link":"https://...Report Part 1.pdf"
}
]
}
}
我想根据以下数组的索引对该javascript进行排序:
['Document', 'Environmental Clearance', 'Real Estate Regulatory Act', 'Miscellaneous Approvals']
因此,我的最终结果将是:
{
"data":
{
"Document":[
{
"id":601,
"project_id":2392,
"parent_type":"Document",
"type":"Land Details",
"name":"FORMS.pdf",
"link":"https://....HotelsFORMS.pdf"
}
],
"Environmental Clearance":[
{
"id":602,
"project_id":2392,
"parent_type":"Environmental Clearance",
"type":"Form 1",
"name":"HotelsCPEMP.pdf",
"link":"https://.....MarineandDyumatHotelsCPEMP.pdf"
}
],
"Real Estate Regulatory Act":[
{
"id":603,
"project_id":2392,
"parent_type":"Real Estate Regulatory Act",
"type":"Building Plan Approval",
"name":"FORMS.pdf",
"link":"https://.....DyumatHotelsFORMS.pdf"
}
],
"Miscellaneous Approvals":[
{
"id":604,
"project_id":2392,
"parent_type":
"Miscellaneous Approvals",
"type":"Not Reported",
"name":"Report Part 1.pdf",
"link":"https://...Report Part 1.pdf"
}
]
}
}
我的代码当前看起来像:
if(response.status === 200)
{
let docs = response.data.data;
let sortDocs = ['Document', 'Environmental Clearance', 'Real Estate Regulatory Act', 'Miscellaneous Approvals'];
let result = []
sortDocs.forEach(function(key) {
this.subscProDocument[key] = result.push(docs[key])
})
}
我得到这样的错误:
未捕获(承诺中)TypeError:无法读取未定义的属性“SubscProdoDocument”
我已经在data()中定义了这个子cprodocument
,并初始化为空数组。帮我解决这个问题。谢谢这是解决方案:
var obj={
“数据”:
{
《房地产监管法》:[
{
“id”:603,
“项目id”:2392,
“母公司类型”:“房地产监管法”,
“类型”:“建筑平面图审批”,
“名称”:“FORMS.pdf”,
“链接”:https://.....DyumatHotelsFORMS.pdf"
}
],
“环境清理”:[
{
“id”:602,
“项目id”:2392,
“母公司类型”:“环境许可证”,
“类型”:“表格1”,
“名称”:“HotelsCPEMP.pdf”,
“链接”:https://.....MarineandDyumatHotelsCPEMP.pdf"
}
],
“文件”:[
{
“id”:601,
“项目id”:2392,
“父类型”:“文档”,
“类型”:“土地详情”,
“名称”:“FORMS.pdf”,
“链接”:https://....HotelsFORMS.pdf"
}
],
“其他批准”:[
{
“id”:604,
“项目id”:2392,
“父类型”:
“杂项批准”,
“类型”:“未报告”,
“名称”:“报告第1部分.pdf”,
“链接”:https://...Report 第1部分.pdf“
}
]
}
};
功能图(it){
var item={};
项目[it]=对象数据[it];
退货项目;
}
log(Object.keys(obj.data).sort().map(map))
您的数据。如果您想对数据对象的项进行排序,数据对象应该是一个数组,因为您不能依赖对象中键的排序,因为它不能得到保证。
这是一个
您可以使用单行对数组进行排序和转换:
data.data = orderedKeys.map(key => ({ [key]: data.data[key] }));
这将为您提供:
{
"data": [
{
"Document": [{
"id": 601,
"project_id": 2392,
...
}]
},
{
"Environmental Clearance": [{
"id": 602,
"project_id": 2392,
...
}]
},
{
"Real Estate Regulatory Act": [{
"id": 603,
"project_id": 2392,
...
}]
},
{
"Miscellaneous Approvals": [{
"id": 604,
"project_id": 2392,
...
}]
}
]
}
以下是一个工作示例:
const数据={
“数据”:{
《房地产监管法》:[{
“id”:603,
“项目id”:2392,
“母公司类型”:“房地产监管法”,
“类型”:“建筑平面图审批”,
“名称”:“FORMS.pdf”,
“链接”:https://.....DyumatHotelsFORMS.pdf"
}],
“环境清理”:[{
“id”:602,
“项目id”:2392,
“母公司类型”:“环境许可证”,
“类型”:“表格1”,
“名称”:“HotelsCPEMP.pdf”,
“链接”:https://.....MarineandDyumatHotelsCPEMP.pdf"
}],
“文件”:[{
“id”:601,
“项目id”:2392,
“父类型”:“文档”,
“类型”:“土地详情”,
“名称”:“FORMS.pdf”,
“链接”:https://....HotelsFORMS.pdf"
}],
“其他批准”:[{
“id”:604,
“项目id”:2392,
“父类型”:
“杂项批准”,
“类型”:“未报告”,
“名称”:“报告第1部分.pdf”,
“链接”:https://...Report 第1部分.pdf“
}]
}
};
const orderedKeys=[‘文件’、‘环境许可’、‘房地产监管法’、‘杂项批准’];
data.data=orderedKeys.map(key=>({[key]:data.data[key]}));
console.log(数据)
您需要将此
作为
或者取一个,它取外部范围的这个
sortDocs.forEach(key => this.subscProDocument[key] = result.push(docs[key]));
从对象中获取数据并分配给无序的
变量
const unordered = data.data;
声明新变量已排序
const ordered = {};
对象。键
将从无序对象
获取键的数组
,然后将排序功能
应用于升序排序的键
然后,我们将在键数组上执行forEach
循环,并将带有键的值分配给有序对象
Object.keys(unordered).sort().forEach(function(key) {
ordered[key] = unordered[key];
});
console.log(ordered);
为什么不将已排序的键数组作为对象的有序访问器?@NinaScholz您可以共享一些链接,我可以从中了解更多信息。@NitishKumar为什么需要在对象中排序?什么时候可以直接使用密钥访问?此外,对象不符合担保顺序。如果希望按数组中的顺序访问属性。而不仅仅是在数组上循环并访问每个属性此错误是因为此
引用了传递给forEach()
的匿名function(){}
。您可以bind()
将该函数绑定到具有subscrodocument
属性的对象。如果您想保持相同的结构,您至少必须将data.data
对象更改为数组,因为JS对象中键的顺序无法保证,请参阅下面我的答案。您的数据。数据不是对象匹配array@CodeManiac,仅在输入数据中,而不是在转换后的输出中。似乎它在某个异步回调中,所以可能给定范围中的此与预期的不同,因此此时引用是不够的
const unordered = data.data;
const ordered = {};
Object.keys(unordered).sort().forEach(function(key) {
ordered[key] = unordered[key];
});
console.log(ordered);