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; });