我想从数组中的每个对象中删除“bad”属性。有没有比使用for循环并从每个对象中删除它更好的方法呢?
var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];
for (var i = 0, len = array.length; i < len; i++) {
delete array[i].bad;
}
似乎应该有一种方法来使用原型或其他东西。我不知道。想法?
答案 0 :(得分:70)
唯一的其他方式是化妆品,实际上是循环。
例如:
array.forEach(function(v){ delete v.bad });
请注意,如果您想与IE8兼容,则需要a shim for forEach。当你提到原型时,prototype.js也是has a shim。
答案 1 :(得分:42)
使用ES6,您可以解构每个对象以创建没有命名属性的新对象:
const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
答案 2 :(得分:14)
我更喜欢使用map删除属性,然后返回新的数组项。
array.map(function(item) {
delete item.bad;
return item;
});
答案 3 :(得分:9)
只有当您的对象相似时,才能使用原型解决方案:
function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];
但是它很简单(和O(1)
):
delete Cons.prototype.bad;
答案 4 :(得分:9)
如果您使用underscore.js:
var strippedRows = _.map(rows, function (row) {
return _.omit(row, ['bad', 'anotherbad']);
});
答案 5 :(得分:1)
您可以按照以下操作进行操作,因为没有找到密钥,因此可读性更高,而不是期望值升高:
# ip4 network
59.9.52.0/24 -allowed
59.9.52.0/29 -allowed
59.9.52.0/21 -not allowed, < 24
#ip6 network
2001:db8::1000/122 -allowed
2001:db8::1000/127 -allowed
2001:db8::1000/100 -not allowed, < 120
答案 6 :(得分:1)
ES6:
const newArray = array.map(({keepAttr1, keepAttr2}) => ({keepAttr1, newPropName: keepAttr2}))
答案 7 :(得分:0)
我建议在Object.assign
循环中使用forEach()
,以便复制对象,并且不影响对象的原始数组
var res = [];
array.forEach(function(item) {
var tempItem = Object.assign({}, item);
delete tempItem.bad;
res.push(tempItem);
});
console.log(res);
答案 8 :(得分:0)
这个问题现在有点老了,但是我想提供一个替代解决方案,它不会变异源数据并且需要最少的人工工作:
function mapOut(sourceObject, removeKeys = []) {
const sourceKeys = Object.keys(sourceObject);
const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
let returnObject = {};
returnKeys.forEach(k => {
returnObject[k] = sourceObject[k];
});
return returnObject;
}
const array = [
{"bad": "something", "good":"something"},
{"bad":"something", "good":"something"},
];
const newArray = array.map(obj => mapOut(obj, [ "bad", ]));
它仍然还不尽完美,但是保持了一定程度的不变性,并且可以灵活地命名要删除的多个属性。 (建议)
答案 9 :(得分:0)
我尝试创建一个新对象而不删除Vue.js中的同伴。
let data =this.selectedContactsDto[];
// selectedContactsDto [] =具有在我的项目中创建的数组对象列表的对象
console.log(数据); 让newDataObj = data.map(({{groupsList,customFields,firstname,... item})=> item); console.log(“ newDataObj”,newDataObj);
答案 10 :(得分:0)
要删除某些键值对表单对象数组,请使用 Postgres SQL 作为数据库,如下例所示:
这是用户函数,返回用户详细信息对象,我们必须从行中删除“ api_secret”键:
function getCurrentUser(req, res, next) { // user function
var userId = res.locals.userId;
console.log(userId)
db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
if(err){
console.log(err)
}
var responseObject = {
_embedded: rows,
}
responseObject._embedded[0].api_secret = undefined
// console.log(api);
// console.log(responseObject);
res.json(responseObject);
});
}
上面的函数将下面的对象作为JSON响应之前返回
{
"_embedded": [
{
"id": "0123abd-345gfhgjf-dajd4456kkdj",
"secret_key: "secret",
"email": "abcd@email.com",
"created": "2020-08-18T00:13:16.077Z"
}
]
}
添加此行responseObject._embedded[0].api_secret = undefined
之后,它给出以下结果作为JSON响应:
{
"_embedded": [
{
"id": "0123abd-345gfhgjf-dajd4456kkdj",
"email": "abcd@email.com",
"created": "2020-08-18T00:13:16.077Z"
}
]
}
答案 11 :(得分:0)
ES6中最短的方法:
array.forEach(e => {delete e.someKey});
答案 12 :(得分:0)
那里有很多图书馆。这完全取决于您的数据结构有多复杂(例如,考虑深度嵌套的键)
我们喜欢object-fields,因为它也可用于深度嵌套的层次结构(为api字段构建参数)。基于object-scan,所以您知道它很快。这是一个简单的代码示例
a[10+1]
答案 13 :(得分:0)
这对我很有效!
export function removePropertiesFromArrayOfObjects(arr = [], properties = []) {
return arr.map(i => {
const newItem = {}
Object.keys(i).map(key => {
if (properties.includes(key)) { newItem[key] = i[key] }
})
return newItem
})
}
答案 14 :(得分:-1)
我认为这是最简单的变体
array.map(({good}) => ({good}))
答案 15 :(得分:-2)
var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
var results = array.map(function(item){
return {good : item["good"]}
});
console.log(JSON.stringify(results));