开发者问题收集

如何在 javascript 中获取输出 { a: 123, bcde: 4, f: 5, gh: 67, };

2022-01-07
90
const input = {
   a: [1, 2, 3],
   b: {
    c: {
     d: {
       e: 4,
     },
    }, 
  }, 
 f: 5,
 g: {
   h: [6, 7],
 },  
};

const outPut = {
 a: 123,
 bcde: 4,
 f: 5,
 gh: 67,
}; 

const getAllKeysOfObject = (obj, key) => {
   let tempKey = key;
   let nextKey = ''
   if (obj instanceof Object && Object.values(obj).length > 0) {
      nextKey = Object.values(obj)[0]     
      tempKey += nextKey;
      getAllKeysOfObject(obj[nextKey], nextKey)
   } else {
     return {key: tempKey, value: obj[nextKey]}
   } 
 }

const getObject = (input) => {
   let tempObj = {}
   Object.keys(input).forEach(key => {
   let value = input[key]  //[1,2]
   console.log(value)
   if (Array.isArray(value)) {
      let tempStr = ''
      for(let i =0;i<value.length;i++) {
         tempStr += value[i]
      }
      tempObj[key] = tempStr;
   } else if (input[key] instanceof Object && Object.values(input[key]).length > 0) {
     let newObj = getAllKeysOfObject(input[key], key)
     tempObj[newObj.key] = newobj.value 
   } else {
     tempObj[key] = input[key]
   }
  })
  return tempObj
}

console.log(getObject(input))

如何在 javascript 中获取输出 { a: 123, bcde: 4, f: 5, gh: 67, };

上述代码未按预期工作,因为键工作正常,但嵌套对象获取失败。获取错误 Uncaught TypeError: 无法读取未定义的属性(读取'')"

JSFiddle 链接 https://jsfiddle.net/ankitg1602/5v2gp64r/49/

2个回答

您可以使用 reduce 方法创建递归函数,如果当前值不是对象,则将其添加到累加器参数,同时跟踪先前的键并将它们传递下去。

const input = {
  a: [1, 2, 3],
  b: {
    c: {
      d: {
        e: 4,
      },
    },
  },
  f: 5,
  g: {
    h: [6, 7],
  },
};

function getOutput(data, pk = '') {
  return Object.entries(data).reduce((r, [k, v]) => {
    const key = pk + k

    if (typeof v === 'object' && !Array.isArray(v)) {
      Object.assign(r, getOutput(v, key))
    } else {
      r[key] = Array.isArray(v) ? Number(v.join('')) : v
    }

    return r;
  }, {})
}

console.log(getOutput(input))
Nenad Vracar
2022-01-07

您可以使用递归获取条目。

这种方法不需要交出最后的密钥。

const
    getEntries = object => Object
        .entries(object)
        .flatMap(([k, v]) => v && typeof v === 'object' && !Array.isArray(v)
            ? getEntries(v).map(([l, r]) => [k + l, r])
            : [[k, [].concat(v).join('')]]
        ),
    input = { a: [1, 2, 3], b: { c: { d: { e: 4 } } }, f: 5, g: { h: [6, 7] } },
    result = Object.fromEntries(getEntries(input));

console.log(result);
Nina Scholz
2022-01-07