如何使用javascript或es6从对象中删除负值



使用javascriptES6检查对象是否具有负值项的最佳方法是什么?如果是这样,请将其从对象中删除?

foo = { 0: 0, 1: -1, 2: 2, 3: -1}

结果应为低于的结果

foo = { 0: 0, 1: 2}

对不起,我有python背景,但我很想听听你的意见。

您可以过滤这些值并获得一个新对象。

假设:

  • 对象只包含类似索引的键(32位正整数值(
  • 密钥从开始到n
  • 顺序应该保持不变
  • 新对象现在具有从zerom的关键帧,其中m <= n,具体取决于正值的计数

解决方案按照ECMA-262的标准顺序获取对象的值(JavaScript是否保证对象属性顺序?(,过滤此数组并将数组分配给对象。

结果是一个对象,其中包含已筛选数组中的键和值。

const
data = { 0: 0, 1: -1, 2: 2, 3: -1 },
result = Object.assign({}, Object.values(data).filter(v => v >= 0));
console.log(result);

您可以使用.filter删除具有负值的元素:

foo = { 0: 0, 1: -1, 2: 2, 3: -1}
let positives = Object.entries(foo).filter(e => e[1]>=0);
foo = {};
positives.forEach(([key, value], index) => {
foo[index] = value;
});
console.log(foo);

如果你想修改现有对象而不是复制,你可以这样做:

let foo = { 0: 0, 1: -1, 2: 2, 3: -1}
for (let [key, value] of Object.entries(foo)) {
if (typeof value === "number" && value < 0) {
delete foo[key];
}
}
console.log(foo);

注意:我添加了typeof value === "number"作为类型安全检查,这样您就可以确保比较一个数值,以防存在其他类型的属性。


或者,在可与用户提供的条件一起使用的可重复使用功能中:

// callback passed (key, value) and
//   return true to keep, false to remove the property
// function returns original object with desired properties removed
function filterProperties(obj, callback) {
for (let [key, value] of Object.entries(obj)) {
if (callback(key, value) === false) {
delete obj[key];
}
}
return obj;
}
let foo = { 0: 0, 1: -1, 2: 2, 3: -1}
filterProperties(foo, (key, value) => !(typeof value === "number" && value < 0));
console.log(foo);

如果您想创建一个新的对象

const fooWithoutNegativeValues = Object.entries(foo).reduce((acc, [key, value]) => value >= 0 ? {...acc, [key]: value} : acc)

变异其不一样的

const foo = { 0: 0, 1: -1, 2: 2, 3: -1}
const result = Object.keys(foo).reduce((acc, curr) => {
if(foo[curr] >= 0) {
acc[curr] = foo[curr]
}
return acc;
}, {})
console.log(result)

此代码只会修改对象以删除负片。

foo = { 0: 0, 1: -1, 2: 2, 3: -1}
Object.keys(foo).map((key) => {
if(foo[key]<0){
delete foo[key]
}
})
console.log(foo);

为了简单的解释,Object.keys(foo(将把对象变成一个基于键名称的数组。然后.map((循环遍历数组中的每个键,如果条件通过,它将删除变量。

最新更新