Javascript 使用u.reject将我的对象转换为数组
我有一些数据需要迭代,并拒绝那些具有Javascript 使用u.reject将我的对象转换为数组,javascript,underscore.js,Javascript,Underscore.js,我有一些数据需要迭代,并拒绝那些具有disabled:true属性的数据 但是,当我尝试\uu0.reject时,我的对象会变成一个数组 var data = { stuff: { item1: { name: "one", disabled: true }, item2: { name: "two" } } }; data.stuff = _.reject(data.stuff, functi
disabled:true
属性的数据
但是,当我尝试\uu0.reject
时,我的对象会变成一个数组
var data = {
stuff: {
item1: {
name: "one",
disabled: true
},
item2: {
name: "two"
}
}
};
data.stuff = _.reject(data.stuff, function(val){
return val.disabled;
});
data.stuff
现在是一个数组,而不是一个对象。我丢失了所有的密钥。您是否考虑过使用_reduce执行此操作,其中备忘录是一个新的散列,您可以在其中合并所需的项(密钥、值对) 当您将data.stuff
(对象)传递到.reject
时,它只拾取对象的值并将其传递到.reject
。因此,键
信息丢失,无法重建对象
相反,你可以这样做
data.stuff = _.object(_.filter(_.pairs(data.stuff), function(list) {
return list[1].disabled;
}));
console.log(data);
输出
{ stuff: { item1: { name: 'one', disabled: true } } }
它的工作原理
{key:value}
对转换为[key,value]
数组禁用
为错误值的项目[key,value]
数组转换为{key:value}
对使用
拒绝
时,原始数据.stuff
不会更改。但是由于您正在分配给stuff
键,原始数据将丢失
\拒绝
应该用于并返回数组。您可以尝试以下方法以实现您的目标:
_.each(Object.keys(data.stuff), function(val) {
if (data.stuff[val].disabled)
delete data.stuff[val];
});
@archie说了些什么,但用的是代码:
data.stuff = _.reduce(data.stuff, function(memo, value, key){
if( !value.disabled) memo[key] = value;
return memo;
}, {});
我最终只使用了本机javascript而不是下划线:
//remove disabled items
for ( var item in data.stuff ) {
if ( data.stuff[item].disabled ) {
delete data.stuff[item];
}
}
您可以改用。使用:
请参阅fiddle:
。
只能返回数组。从语义上讲,你的东西实际上应该是数组。真的item1
,item2
要么是有用的数据(然后分别将其转换为id
属性),要么不是有用的数据(然后将其删除)。虽然这样做有效,但使用omit()
有一个简单得多的解决方案。请参见下文。此解决方案是为下划线而定制的,但。pairs
不是Lodash中的fn不起作用-省略返回相同的数据,即使发送数据。stuff
不起作用-省略返回相同的数据,即使发送数据。stuff
@gdible它确实起作用。我用提琴更新了答案。):返回[“item1”,“item2”]
我喜欢这个普通的JS解决方案,但如果它像您最初尝试的那样内联工作,那将是最好的。对于本文中唯一有效的解决方案,请尝试@gruf Bunny的答案+1这是这个问题中唯一可以内联工作(返回数据)并实际返回正确答案的解决方案::{item2:{name:{two}}
事实上,省略()
更好,因为它是专门为手头的工作设计的工具。
_.omit(data.stuff, function(val) { return val.disabled; });