我有一个像这样的嵌套对象:
var depositOptions = {
0 : {name: 'Monthly'},
1 : {name : 'Standard'},
2 : {name: 'Full' },
3 : {name: 'Low' }
};
我需要移除name = 'Standard'
所在的对象,以便我使用Underscore.js _.each
对其进行迭代,直到找到它并存储索引。
_.each(depositOptions, function(option, i) {
if (option.name === 'Standard') {
// delete the object at index i
console.log(i)
}
});
所以我想在找到standard
时删除该选项 - 最简单的方法是什么?
1)当找到_.each
时,在standard
循环内删除它? (因此无需索引)
2)存储我要删除的对象的索引,然后在我完成迭代后删除它? (我发现这很难,因为如何在循环之外获得索引?)
3)在迭代depositOptions
时开始创建一个新数组,以便在不包含standard
的情况下构建新数组
当我说我要删除它时,我希望它完全消失。因此,不仅undefined
喜欢使用delete
。
答案 0 :(得分:2)
改为使用_.filter
或_.reject
。使用_.each
并不清楚。请注意,这些返回一个新数组。
var newArray = _.filter(depositOptions, function(option) {
return option.name !== 'Standard';
});
看起来你有一个对象,而不是一个数组。这是一个数组:
var depositOptions = [
{name: 'Monthly'},
{name : 'Standard'},
{name: 'Full' },
{name: 'Low' }
];
答案 1 :(得分:1)
您可以使用_.without
功能消除您不需要的密钥
var depositOptions = {
0 : {name: 'Monthly'},
1 : {name : 'Standard'},
2 : {name: 'Full' },
3 : {name: 'Low' }
};
depositOptions = _.without(depositOptions, _.findWhere(depositOptions, {
name: 'Standard'
}));
console.log(depositOptions);
希望这有帮助!
答案 2 :(得分:1)
如果要返回带有过滤属性的新对象,可以在普通javascript中使用Object.keys()
和reduce()
。
var depositOptions = {
0 : {name: 'Monthly'},
1 : {name : 'Standard'},
2 : {name: 'Full' },
3 : {name: 'Low' }
};
var result = Object.keys(depositOptions).reduce(function(r, k) {
if (depositOptions[k].name != 'Standard') r[k] = depositOptions[k]
return r;
}, {})
console.log(result)

答案 3 :(得分:0)
据我所知,使用下划线的最佳方法是_reject
。
用法 -
_.reject(depositOptions, function(val){ return val.name == 'Standard'; });
选项3肯定不是一个选项,因为您使用的是排除方法,您尝试获取除您想要的所有元素之外的所有其他元素。利用你想要的元素。你的实施太脏了!
选项2优于选项3但不理想,因为您已找到元素&你仍在浪费你的时间迭代别人
带有调整的选项1是最佳解决方案来自给定的选项 - 小调整包括在if语句中添加中断语句存储元素后。这样你只需迭代直到找到元素。
答案 4 :(得分:0)
您有两个选项,您可以改变原始对象,也可以创建一个没有不需要的键值对的新对象。所有示例都在普通的ES6中,但您可以轻松使用lodash方法。他们将排除所有比赛而不仅仅是第一场比赛。
突变。使用for..of和Object.keys
const depositOptions = {
0: {
name: 'Monthly'
},
1: {
name: 'Standard'
},
2: {
name: 'Full'
},
3: {
name: 'Low'
}
};
for (let key of Object.keys(depositOptions)) {
if (depositOptions[key].name === 'Standard') {
delete depositOptions[key];
}
}
console.log(depositOptions);
创建新对象,而不引用不需要的对象。
const depositOptions = {
0: {
name: 'Monthly'
},
1: {
name: 'Standard'
},
2: {
name: 'Full'
},
3: {
name: 'Low'
}
};
const depositOptionsFiltered = {};
for (let key of Object.keys(depositOptions)) {
if (depositOptions[key].name !== 'Standard') {
depositOptionsFiltered[key] = depositOptions[key];
}
}
console.log(depositOptionsFiltered);
您甚至可能希望新对象和键值对象是原始对象的副本,而不是对它们的引用。在这种情况下,您可以执行浅拷贝。使用Object.assign
const depositOptions = {
0: {
name: 'Monthly'
},
1: {
name: 'Standard'
},
2: {
name: 'Full'
},
3: {
name: 'Low'
}
};
const depositOptionsFiltered = {};
for (let key of Object.keys(depositOptions)) {
if (depositOptions[key].name !== 'Standard') {
depositOptionsFiltered[key] = Object.assign({}, depositOptions[key]);
}
}
console.log(depositOptionsFiltered);