【问题标题】:change the value of every object in an array if 0 to null如果为 0,则将数组中每个对象的值更改为 null
【发布时间】:2020-09-16 05:57:44
【问题描述】:

我有这个例子:

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

我想把每一个 0 的值都改成 null

const sample = [
  { id: 1, val1: null, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: null, val29: null },
  { id: 11, val1: null, any: null, sample: null, val29: 10 },
];

我知道我需要使用 map,但我无法访问每个对象。

【问题讨论】:

  • value 是指 val1、val2 等...吗?
  • 请访问help center,使用tour查看内容和How to Ask。做一些研究,搜索关于 SO 的相关主题;如果您遇到困难,请发布您的尝试minimal reproducible example,并使用[<>] sn-p 编辑器记录输入和预期输出。

标签: javascript typescript ecmascript-6


【解决方案1】:

如果你没有方法,这也可以。

您将其字符串化并使用替换函数将所有零替换为null。然后将其解析回来。

也适用于更深的嵌套对象

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

let str = JSON.stringify(sample,(k, v) =>  v === 0 ? null : v);
let result = JSON.parse(str);

console.log(result);

【讨论】:

    【解决方案2】:

    如果你不想要一个新数组,你需要 forEach

    const sample = [ { id: 1, val1: 0, val4: 10 }, { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 }, { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 }];
    
    sample.forEach(item => { 
      for (val in item) item[val] = item[val] === 0 ? null : item[val] 
    });
    console.log(sample)

    【讨论】:

      【解决方案3】:

      您可能希望遍历列表,然后为对象中的每个属性检查 val

      const sample = [
        { id: 1, val1: 0, val4: 10 },
        { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
        { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
      ];
      
      let sample1 = sample[0]; //<<-- you may loop through your entire array
      
      for (const [key, value] of Object.entries(sample1)) {
        if (key.lastIndexOf('val')>=0 && value === 0){
             sample1[key] = null;
         }
      }
      
      console.log(sample1)

      【讨论】:

        【解决方案4】:

        你可以使用这个,但是你需要let来重用变量名

        let sample = [
          { id: 1, val1: 0, val4: 10 },
          { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
          { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
        ];
        sample = sample.map(obj => {
          Object.keys(obj).forEach(key => {
            obj[key] = obj[key] || null;
          });
          return obj;
        });
        
        console.log(sample)

        这基本上是获取每个对象的键,然后根据obj[key] = obj[key] || null 中的键检查对象的值。所以当obj[key] 为0、null 或undefined 时,它将变为null,否则不会更新。

        【讨论】:

        • 我给你做了一个sn-p。我还删除了不必要的传播 [...] - 最后,您还将使用虚假快捷方式将 valx: "" 设置为 null。否则代码比我的短
        • @mplungjan 谢谢。我认为直接使用Object.keys(obj) 是不行的,所以我使用了扩展运算符。
        【解决方案5】:

        这就是Array.prototype.map 的用途,它接受一个函数作为参数,为数组的每个元素调用一次,同时提供元素本身作为参数。 .map 函数返回一个新集合,不直接修改原始集合。无论每个元素的参数函数的返回值是什么,都会成为新构造的数组中该元素的新值。

        在你的情况下,虽然它有点复杂,因为每个元素本身都是一个对象,所以我们可以将每个对象转换为一个数组,映射是自己的属性,并将重建的对象返回给我们的主 .maps 参数函数

        所以..

        sample=sample.map(function (currentElement){
            return (typeof(currentElement) == "object" ?
                Object.fromEntries(
                    Object.entries(
                        currentElement
                    ).map(function (prop){
                        return prop === 0 ? null : prop
                    })
                ) : currentElement
            )
        })
        

        【讨论】:

        • 不,这不一定是 map 的用途,因为 map 将返回一个 NEW 数组,如果您只想修改现有数组,则不需要,那么这就是 forEach 的用途。对于一个非常简单的任务,您的代码非常复杂
        • @mplungjan ok 怎么能更简单?
        • @mplugjan 我看到了我自己的
        • sample.forEach(item =&gt; { for (val in item) item[val] = item[val] === 0 ? null : item[val] }); 比你的简单吗?
        【解决方案6】:

        我有一个仅使用地图的解决方案,可能会有所帮助:

        var sample = [
            { id: 1, val1: 0, val4: 10 },
            { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
            { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
          ]; 
        var output = sample.map((item) => {
              Object.keys(item).map((key) => {
                item[key] = (item[key] == 0 ? null : item[key]); return item[key]
              });
              return item;
          });
          
          console.log(output);

        【讨论】:

        • 这与此处的多个其他答案相同
        • 同意,方法有点不同,对吧?
        • 是的,没有必要使用 {} 和 () ;)
        • 是的,我可以删除
        【解决方案7】:

        您可以使用“for...in”来访问每个对象

        Demo Here

        const sample = [
          { id: 1, val1: 0, val4: 10 },
          { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
          { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
        ];
        
        sample.map((s) => {
          for (let i in s) if (s[i] === 0) s[i] = null;
          return s;
        });
        console.log(sample);

        【讨论】:

        • 为什么使用 map 而不是 forEach。您不需要创建数组映射
        • 你也不需要返回任何东西:sample.forEach(s =&gt; { for (let i in s) if (s[i] === 0) s[i] = null; });
        【解决方案8】:

        不可变样式

        const sample: Record<string, unknown>[] = [
          { id: 1, val1: 0, val4: 10 },
          { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
          { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 }
        ]
        
        const updated = sample.map((rec) =>
          Object.keys(rec).reduce<Record<string, unknown>>(
            (acc, key) => (rec[key] == 0 ? { ...acc, [key]: null } : { ...acc, [key]: rec[key] }),
            {}
          )
        )
        
        console.log(updated)
        // OUTPUT
        // [
        //   { id: 1, val1: null, val4: 10 },
        //   { id: 10, val1: 1, val4: 10, val19: null, val29: null },
        //   { id: 11, val1: null, val4: null, val19: null, val29: 10 }
        // ]
        

        【讨论】:

          猜你喜欢
          • 2023-01-12
          • 1970-01-01
          • 2015-08-16
          • 2020-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-11
          • 2021-11-05
          相关资源
          最近更新 更多