【问题标题】:how to remove negative values from object using javascript or es6如何使用 javascript 或 es6 从对象中删除负值
【发布时间】:2020-08-24 17:41:14
【问题描述】:

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

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

结果应该是下面那个

foo = { 0: 0, 1: 2}

对不起,我来自python 背景,但我很想收到你的来信。

【问题讨论】:

  • 您要改变对象还是创建一个新对象?
  • @trincot 是的!我很好。
  • 这是一个或问题...?你的意思是“是变异”还是“是新”?
  • 从外观上看(不保持键值配对,键始终是从0 开始的连续数字)。您可能应该使用数组。
  • @trincot 我的错。 create a new one 会很好

标签: javascript algorithm object data-structures ecmascript-6


【解决方案1】:

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

假设:

  • 对象仅包含类似键的索引(32 位正整数值)。
  • 键从 zeron
  • 顺序应保持不变。
  • 新对象现在具有从 zerom 的键,其中 m <= n,具体取决于正值的计数。李>

该解决方案以 ECMA-262 (Does JavaScript guarantee object property order?) 的标准顺序获取对象的值,过滤此数组并将该数组分配给一个对象。

结果是一个对象,其键和值来自过滤后的数组。

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

console.log(result);

【讨论】:

  • 如果我们提供data = { 0: 0, 1: -1, 2: 2, 3: 4 }之类的输入,输出应该是什么?
  • @Nithish,这个:{ 0: 0, 1: 2, 2: 4 }
  • 是的,我检查过了,在这种情况下它是预期的输出吗?不应该是{ 0: 0, 1: 2, 2: 2, 3:4 }
  • afaik,op 将从 0 ... n 中获取键和值,而不是负值。
【解决方案2】:

您可以使用.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);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 添加了可复用的函数版本。
    【解决方案4】:

    如果你想创建一个新对象

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

    改变它并没有什么不同

    【讨论】:

      【解决方案5】:

      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)

      【讨论】:

      • 仅供参考,这会产生一个新对象。它不会从现有对象中删除属性。它也只检查值是否不是-1,而不是检查它是否为负。
      • 改变对象违反函数式编程规则,可能会产生意想不到的后果,但可以使用相同的逻辑来改变foo,我更新了答案以检查负值。
      • 对象一直在变化。您从未为对象分配属性吗?这完全取决于编程情况的要求。 OP 要求“从对象中删除负值”。他们没有要求复制具有不同属性的对象。
      【解决方案6】:

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

      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() 循环遍历数组中的每个键,如果条件通过则删除该变量。

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 2019-07-11
        • 1970-01-01
        • 2017-06-19
        • 1970-01-01
        • 2018-08-15
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多