使用下划线

时间:2016-09-15 09:55:26

标签: javascript

我有一个像这样的嵌套对象:

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

5 个答案:

答案 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..ofObject.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);