Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用lodash(或vanilla javascript)对对象数组进行排序和筛选_Javascript_Sorting_Filtering_Lodash - Fatal编程技术网

使用lodash(或vanilla javascript)对对象数组进行排序和筛选

使用lodash(或vanilla javascript)对对象数组进行排序和筛选,javascript,sorting,filtering,lodash,Javascript,Sorting,Filtering,Lodash,我有一个对象,我想通过只保留2个最高的对象值来排序和过滤 obj={ A :[{ asset: 9, biodiversity: 4, infrastructure: 15, deflation: 11, energy: 9 }], B:[{ asset: 12, biodiversity: 10, infrastructure: 9, deflation: 7,

我有一个对象,我想通过只保留2个最高的对象值来排序和过滤

obj={ A :[{
      asset: 9,
      biodiversity: 4,
      infrastructure: 15,
      deflation: 11,
      energy: 9
    }],
  B:[{
      asset: 12,
      biodiversity: 10,
      infrastructure: 9,
      deflation: 7,
      energy: 15
    }],
  C:[{
      asset: 2,
      biodiversity: 12,
      infrastructure: 6,
      deflation: 6,
      energy: 8
    }]}
我想按对象的值对对象进行排序,并筛选出2个最高值,例如:

{A :[{
      infrastructure: 15,
      deflation: 11
    }],
  B:[{
      energy: 15,
      asset: 12
    }],
  C:[{
      biodiversity: 12,
      energy: 8
    }]}
我已经尝试过这样的分类:

Object.keys(obj).forEach((a) => _.sortBy(obj[a][0])))
但这显然是错误的。
我正在使用lodash,但也会接受香草javascript解决方案。

您可以获取内部对象的条目并按值降序排序,获取最上面的两个键/值对,然后从中构建新对象

const
数据={A:[{资产:9,生物多样性:4,基础设施:15,通货紧缩:11,能源:9}],B:[{资产:12,生物多样性:10,基础设施:9,通货紧缩:7,能源:15}],C:[{资产:2,生物多样性:12,基础设施:6,通货紧缩:6,能源:8},
结果=对象。fromEntries(对象
.条目(数据)
.map([k,a])=>k,a.map(o=>Object.fromEntries(Object
.条目(o)
.sort((a,b)=>b[1]-a[1])
.slice(0,2)
))])
);
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
(编辑/注意:这是基于您最初发布的代码。我很高兴看到您更新了问题并删除了包装数组。)

这里有一个相对实用的方法

secondLargestValue
函数查找每个对象内的阈值。
copyWithoutValsBelowThreshold
函数提供对象的修改副本

我们循环遍历顶级对象中的条目并应用这两个函数。 有关进一步的说明,请参见规范中的注释

let json=getArray();//标识原始数组
//定义'secondLargestVal'函数
const secondLargestVal=someObj=>
//按降序数字排序后获取数组的第二项
Object.values(someObj).sort((a,b)=>b-a)[1];
//定义“copyWithoutValsBelowThreshold”函数
const copywithout vals低于阈值=((someObj,阈值)=>{
//此函数不会改变原始值
clone=Object.assign({},someObj);//复制obj
for(让道具进入克隆){
//循环浏览属性,删除不符合条件的属性
如果(克隆[prop]<阈值){
删除克隆[prop];
}
}
返回克隆;
});
//定义我们的主要功能
常量mutateJson=()=>{
让entries=Object.entries(json[0]);
条目=条目。映射(条目=>{
//'entry[0]`是属性名(例如:'A')--我们实际上不使用这个
//`entry[1]`是值(在本例中,是包含单个对象的数组)
设obj=entry[1][0];//标识实际对象
const threshold=secondLargestVal(obj);//标识最小值
//更新条目,删除值过低的属性
条目[1][0]=copywithoutvals低于阈值(obj,阈值);
返回条目;
});
json[0]=Object.fromEntries(entries);//替换顶级对象
}
//调用主函数
mutateJson();
log(json);
//提供原始数组
函数getArray(){
返回[{A:[{
资产:9,
生物多样性:4,
基础设施:15,
通缩:11,
能源:9
}],
B:[{
资产:12,
生物多样性:10,
基础设施:9,
通缩:7,
能源:15
}],
C:[{
资产:2,
生物多样性:12,
基础设施:6,
通缩:6,
能源:8
}]}]

}
请阅读
json
标记的使用说明,并查看您对“json”一词的使用情况。这个问题与JSON无关。这是一个有效的(RFC 8259),所以我不知道您在说什么。您是否阅读了
JSON
标记的描述,尤其是大写字母?不管怎样,我也相应地更新了你的问题。