【问题标题】:Extract key vale from specific keys [duplicate]从特定键中提取键值[重复]
【发布时间】:2021-05-26 12:52:06
【问题描述】:

假设我有 json 为:

const details = {
    "something1":1,
    "something2":20,
    "something3":123,
    "something4":[{"a":"apple","b":"ball"},
    "something5":1211
}

为此我尝试过:

let final = {}

for (let keys in details) {
    // console.log(keys)
    if (keys == 'something1'|| 'something2'|| 'something3') {
        final[keys] = details[keys]
    }
}

但它给我的结果与 details

相同

预期的 O/p 应该是 ...

console.log(final) => {"something1":1,"something2":20,"something3":123}

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    您可以filter()对象的条目,然后使用Object.fromEntries将其转换回对象

    const details = {
        "something1":1,
        "something2":20,
        "something3":123,
        "something4":[{"a":"apple","b":"ball"}],
        "something5":1211
    }
    
    const removeProps = (obj, props) => (
         Object.fromEntries(Object.entries(obj).filter(([k, _]) => !props.includes(k)))
    )
    
    const res = removeProps(details, ['something1', 'something2']);
    console.log(res)

    【讨论】:

      【解决方案2】:

      问题出在keys === 'something1'|| 'something2'|| 'something3':

      const details = {
          "something1":1,
          "something2":20,
          "something3":123,
          "something4":[{"a":"apple","b":"ball"}],
          "something5":1211,
          }
          
      let final = {}
      
      for (let keys in details) {
          // console.log(keys)
          if (keys === 'something1'|| keys === 'something2'|| keys==='something3') {
              final[keys] = details[keys]
          }
      }
      
      console.log(final)

      【讨论】:

        【解决方案3】:

        您可以使用解构函数并获取新对象。

        const
            getParts = ({ something1, something2, something3 }) => ({ something1, something2, something3 }),
            details = { something1: 1, something2: 20, something3: 123, something4: [{ a: "apple", b: "ball" }], something5: 1211 },
            final = getParts(details);
        
        console.log(final);

        动态方法

        const
            details = { something1: 1, something2: 20, something3: 123, something4: [{ a: "apple", b: "ball" }], something5: 1211 },
            wanted = ['something1', 'something2', 'something3'],
            final = Object.fromEntries(wanted.map(k => [k, details[k]]));
        
        console.log(final);

        【讨论】:

          【解决方案4】:

          已经有很好的答案可以说明如何解决问题,但它们没有解释为什么您的代码不起作用。

          原因是你误解了这个布尔条件的作用:

          keys == 'something1'|| 'something2'|| 'something3')
          

          不是的意思是:key 是任何一个
          这确实意味着:

          1. 如果keys == 'something1'
          2. 或者如果'something2'
          3. 或者如果'something3'

          您的第二个和第三个 or 表达式只是纯字符串。
          并且任何非空字符串的计算结果都是布尔值true

          // non-empty strings are boolean TRUE
          console.log(`Boolean: 'something2'`, Boolean('something2'));
          // empty strings are boolean FALSE
          console.log(`Boolean: ''`, Boolean(''));

          因此,您的第二个和第三个 OR 条件始终为 true,因此整个条件为 true

          因此,如果您想坚持显式比较,请使用:

          if (keys === 'something1'|| keys === 'something2'|| keys==='something3') {
          

          顺便说一句:您可能想使用=== 而不是==:请参阅Javascript === (triple equals)

          【讨论】:

          • 感谢您抽出宝贵时间并提供适当的解释。 :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 1970-01-01
          • 1970-01-01
          • 2020-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多