使用_.reject将我的对象转换为数组

时间:2014-01-05 07:30:40

标签: javascript underscore.js

我有一些我想要迭代的数据并拒绝那些disabled: true属性的数据。

然而,当我尝试_.reject时,我的对象变成了一个数组。

var data = {
  stuff: {
     item1: {
        name: "one",
        disabled: true
     },
     item2: {
        name: "two"
     }

  }
};


data.stuff = _.reject(data.stuff, function(val){
    return val.disabled;
});

data.stuff现在是一个数组,而不是一个Object。我丢失了所有的钥匙。

7 个答案:

答案 0 :(得分:5)

您可以改用_.omit()

答案 1 :(得分:4)

@archie在代码中说了什么:

data.stuff = _.reduce(data.stuff, function(memo, value, key){
    if( !value.disabled) memo[key] = value;
    return memo;
}, {});

答案 2 :(得分:3)

当您将data.stuff(对象)传递给_.reject时,它只选择对象的值并将其传递给_.reject。因此,key信息丢失,无法重建对象。

相反,你可以这样做

data.stuff = _.object(_.filter(_.pairs(data.stuff), function(list) {
    return list[1].disabled;
}));

console.log(data);

<强>输出

{ stuff: { item1: { name: 'one', disabled: true } } }

工作原理

  1. _.pairs{key:value}对转换为[key, value]数组。

  2. _.filter会过滤disabled为假值的项目。

  3. _.object将已过滤的[key, value]数组转换为{key:value}对。

答案 3 :(得分:1)

我最终只使用原生javascript而不是下划线:

//remove disabled items
for ( var item in data.stuff ) {
    if ( data.stuff[item].disabled ) {
        delete data.stuff[item];
    }
}

答案 4 :(得分:1)

使用_.omit()

_.omit(data.stuff, function(val) { return val.disabled; });

请参阅小提琴:https://jsfiddle.net/ehbmsb5k/

答案 5 :(得分:0)

您是否考虑过使用_reduce执行此操作,其中备忘录是一个新哈希,您可以在其中合并所需的项目(键,值对)。

答案 6 :(得分:-1)

使用data.stuff时,原始reject不会更改。但由于您要分配stuff密钥,原始数据将丢失。

_.reject应该可以处理并返回数组。你可以尝试这样做,以实现你想要的:

_.each(Object.keys(data.stuff), function(val) {
    if (data.stuff[val].disabled)
        delete data.stuff[val];
});