Javascript JS:只对对象数组中的一个字段进行排序
我有下一个数组结构:Javascript JS:只对对象数组中的一个字段进行排序,javascript,Javascript,我有下一个数组结构: const arr = [ { label: 'Apple', data: [{test: '1'}, {test: '2'}], collapsedData: [{test: '1'}, {test: '2'}], }, { label: 'Orange', data: [{test: '3'}, {test: '4'}], collapsedData: [{test: '3'},
const arr = [
{
label: 'Apple',
data: [{test: '1'}, {test: '2'}],
collapsedData: [{test: '1'}, {test: '2'}],
},
{
label: 'Orange',
data: [{test: '3'}, {test: '4'}],
collapsedData: [{test: '3'}, {test: '4'}],
},
{
label: 'Tomato',
data: [{test: '5'}, {test: '6'}],
collapsedData: [{test: '5'}, {test: '6'}],
},
{
label: 'Banana',
data: [{test: '7'}, {test: '8'}],
collapsedData: [{test: '7'}, {test: '8'}],
}
]
我还提供了一种对数组排序的方法——sortArr
——按字母表对数组排序
我需要迭代arr
并将sortArr
应用于data
和collapsedData
,如果标签是Apple
因此,data
和collapsedData
应该为Apple
标签排序
期望输出:
const outputArr = [
{
label: 'Apple',
data: [{test: '2'}, {test: '1'}],
collapsedData: [{test: '2'}, {test: '1'}],
},
{
label: 'Orange',
data: [{test: '3'}, {test: '4'}],
collapsedData: [{test: '3'}, {test: '4'}],
},
{
label: 'Tomato',
data: [{test: '5'}, {test: '6'}],
collapsedData: [{test: '5'}, {test: '6'}],
},
{
label: 'Banana',
data: [{test: '7'}, {test: '8'}],
collapsedData: [{test: '7'}, {test: '8'}],
}
]
解决方案是什么?请查看以下内容:
function sortExceptApples(arr){
for (let i = 0; i < arr.length; i++)
if (arr[i].label !== "Apple")
arr[i] = { ...arr[i], data: sortArr(arr[i].data), collapsedData: sortArr(arr[i].collapsedData) }
return arr
}
根据你的问题
我需要迭代arr
并对数据应用sortArr,如果标签是Apple,则折叠数据
arr.filter(x=>x.label=='Apple')
过滤你的arr
,只获取Apple
记录forEach
对其进行循环,并对内部对象data
&collapsedData
数据
是对象
的数组
,因此需要使用其属性值进行筛选,如a.test
。我在a.test
之前附加了+
,它将值转换为数字
const arr=[
{
标签:“苹果”,
数据:[{test:'2'},{test:'1'}],
collapsedData:[{test:'2'},{test:'1'}],
},
{
标签:“橙色”,
数据:[{test:'3'},{test:'4'}],
collapsedData:[{test:'3'},{test:'4'}],
},
{
标签:“西红柿”,
数据:[{test:'5'},{test:'6'}],
collapsedData:[{test:'5'},{test:'6'}],
},
{
标签:“香蕉”,
数据:[{test:'7'},{test:'8'}],
collapsedData:[{test:'7'},{test:'8'}],
}
];
常数t=()=>{
arr.filter(x=>x.label=='Apple')
.forEach(x=>{
x、 数据排序((a,b)=>+a.test-+b.test);
x、 collapsedData.sort((a,b)=>+a.test-+b.test);
});
返回arr;
}
console.log(t())代码>这是否回答了您的问题?一个循环和一个if
@Andreas你能分享一个例子吗?for(让i=0;i
arr是你的输出,它是一个数组。这个函数返回什么?如果我这样使用它:const t=()=>{return arr.filter(x=>x.label=='Apple').forEach(x=>{x.data.sort((a,b)=>+a.test-+b.test);x.collapsedData.sort((a,b)=>+a.test+b.test;});它返回未定义的forEach
将不返回任何内容,因此您得到的是未定义。您需要添加
return arr;`转到下一行。那它就会起到你所期望的作用。我还更新了我的答案。filter
将返回array
,但forEach
不会返回任何内容。所以你可以像constfilteredar=arr.filter(…)
然后过滤数据。forEach(…)
。然后返回filteredar代码>。
let outputArr = sortExceptApples(arr)