删除对象列表中不需要的对象
JS - Deleting unnecessary objects inside a list of objects
我的Node服务器中有一个对象,它包含数千个对象,每个对象是一个人,他有一个totalScore。它看起来像这样:
var mainObject = { //it's unsorted, but no need to sort it anyway
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"}
}
现在,我想在我的mainObject中保留1000个对象,但问题是我需要在发送到客户端之前使用delete mainObject[name]擦除最低分数(可以接受除delete以外的其他解决方案)。
mainObject内部的每个对象的索引不应该彼此交换(有一个原因),只是最低的分数需要去,列表应该作为一个对象发送到客户端,并且长度恰好为1000。
您正在尝试将基于数组的概念(如长度和排序)应用于对象。那可不行。
要实现你想要的,你必须将你的对象转换为数组。你可以这样做:
var mainObject = {
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"},
};
var mainArray = Object.keys(mainObject).map(function (name) {
return Object.assign({}, mainObject[name], {name});
});
console.log(mainArray);
你可以按分数排序你的数组,只返回N个最高的条目:
var mainArray = [
{
"totalScore": 5,
"info": "No",
"name": "john"
},
{
"totalScore": 3,
"info": "No",
"name": "james"
},
{
"totalScore": 55,
"info": "No",
"name": "lee"
}
]
mainArray.sort(function (a, b) {
return b.totalScore - a.totalScore;
});
console.log(mainArray.slice(0, 1000));
如果出于某种原因你的客户端绝对需要返回一个对象而不是一个对象数组,你总是可以转换回来:
var mainArray = [
{
"totalScore": 5,
"info": "No",
"name": "john"
},
{
"totalScore": 3,
"info": "No",
"name": "james"
},
{
"totalScore": 55,
"info": "No",
"name": "lee"
}
];
var mainObject = mainArray.reduce(function (prev, curr) {
var name = curr.name;
delete curr.name;
prev[name] = curr;
return prev;
}, {});
console.log(mainObject);
但是在这一点上,你已经做了相当多的工作来实现你的目标。这意味着这实际上是一个XY问题,您应该重新考虑导致您出现这种情况的决策。
var desiredAmountOfObjects = 2
var mainObject = { //it's unsorted, but no need to sort it anyway
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"}
}
var mainArray = _.map(mainObject, (value, key) => Object.assign(value, { key }))
mainArray.sort(function (a, b) {
return b.totalScore - a.totalScore;
});
var choppingBlock = mainArray.slice(desiredAmountOfObjects).map(chop => chop.key)
console.log(choppingBlock);
var desiredObject = _.omitBy(mainObject, (value, key) => choppingBlock.indexOf(key) > -1)
console.log(desiredObject)
http://jsbin.com/gijuduzole/1/edit?js,控制台
设置desiredAmountOfObject为1000或其他值
根据注释-从初始对象创建一个您可以排序的数组,然后取除x外的所有结果,并从初始对象中删除这些结果。
// object
var mainObject = { //it's unsorted, but no need to sort it anyway
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"}
}
// array
var array = [];
for (var i in mainObject)
array.push({ key: i, score: mainObject[i].totalScore });
// sort
array.sort(function(a,b){ return a.score < b.score });
// keep top x
var remove = array.slice(2);
// delete all the others
for (var i=0; i<remove.length; i++)
delete mainObject[remove[i].key];
console.log(mainObject);
小提琴:https://jsfiddle.net/xrc8hpya/1/
您可以使用对象。键和数组迭代方法:
const mainObject = {
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"}
};
const keys = Object.keys(mainObject);
const lowest = keys.map(key => mainObject[key].totalScore).sort()[0];
const removed = keys.reduce((result, key) => {
if(mainObject[key].totalScore > lowest){
result[key] = mainObject[key];
}
return result;
}, Object.create(null));
console.log('without objects with lowest score');
console.log(removed);
// EDIT -- Or, to retain keys:
const removed2 = keys.reduce((result, key) => {
result[key] = mainObject[key].totalScore > lowest
? mainObject[key]
: undefined;
return result;
}, Object.create(null));
console.log('retaining all keys');
console.log(removed2);
引用
种
Array.prototype.map
Array.prototype.reduce
有很多库可以帮助您解决这类问题(underscore, lodash, ramda)。
一个使用ramda的例子:
const mainObject = { //it's unsorted, but no need to sort it anyway
john: {totalScore: 5, info: "No"},
james: {totalScore: 3, info: "No"},
lee: {totalScore: 55, info: "No"}
}
const obj = R.filter((person) => person.totalScore > 50, mainObject);
- JS变量返回的对象不是值
- 对象不支持属性或方法“自动完成”
- 如何在不需要单击按钮的情况下获取选项的值
- Mongoose TypeError:实例化模式类型的对象时,对象不是函数
- find()方法返回具有不需要的属性的对象
- AngularJS指令拖动对象如何删除不需要的鼠标效果
- 将 JSON 字符串转换为 JSON 对象,这样我就不需要在基本的 jquery.dataTables.js 中进行更改
- 数组最后一个单元格中不需要的对象
- PHP echo,在对象(需要)之前输出完整的 html 代码(不需要)
- Concat 对象不起作用,或者我需要将值转换为正确的格式
- 在grunt中设置一个属性就是创建一个不需要的json对象
- 为什么数学对象在javascript中不需要新关键字
- 函数.调用类似数组的对象,不需要第一个参数
- 删除对象列表中不需要的对象
- 使用string key访问或创建嵌套JavaScript对象,不需要eval
- 应用程序以某种方式将不需要的参数写入对象
- 可以将对象的属性传递给函数,而不需要定义参数,并通过对象的键来使用它们
- 从数组中获取特定对象而不需要循环的最佳方法
- 从对象数组中删除不需要的键
- 为什么如果我将对象传递到函数中,我不需要在javascript中声明函数参数