【问题标题】:Convert Array to Object in Javascript/nodejs在 Javascript/nodejs 中将数组转换为对象
【发布时间】:2021-09-20 01:07:04
【问题描述】:

我想将下面的对象转换为预期的对象。我正在使用 Javascript/node js 代码来执行此操作,但无法实现。我尝试了很多方法,但都没有实现。

原文:


{
  "0": {
    "buildVersion": {
      "0": "6.15",
      "1": "6.16"
    },
    "market": "CORE"
  },
  "1": {
    "buildVersion": {
      "0": "6.15",
      "1": "6.16"
    },
    "market": "US"
  },
  "2": {
    "buildVersion": {
      "0": "6.15.1",
      "1": "6.16.2"
    },
    "market": "CA"
  }
}

预期:

[
  {
    "market": "CORE",
    "buildVersion": [
      "6.15",
      "6.16"
    ]
  },
  {
    "market": "US",
    "buildVersion": [
      "6.15",
      "6.16"
    ]
  },
  {
    "market": "CA",
    "buildVersion": [
      "6.15.1",
      "6.16.2"
    ]
  }
]

【问题讨论】:

    标签: javascript node.js arrays object


    【解决方案1】:

    最简单的方法是在类数组对象上调用Object.values

    const data = {
      "0": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "CORE"
      },
      "1": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "US"
      },
      "2": {
        "buildVersion": {
          "0": "6.15.1",
          "1": "6.16.2"
        },
        "market": "CA"
      }
    };
    
    const fixed = Object.values(data).map(({ buildVersion, ...rest }) =>
      ({ ...rest,  buildVersion: Object.values(buildVersion) }));
    
    console.log(fixed);
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    这是一个使用递归的更动态的示例。它会在转换之前检查对象是否类似于数组。

    const data = {
      "0": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "CORE"
      },
      "1": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "US"
      },
      "2": {
        "buildVersion": {
          "0": "6.15.1",
          "1": "6.16.2"
        },
        "market": "CA"
      }
    };
    
    const fix = o =>
      typeof o === 'object'
        ? Object.keys(o).every(k => isFinite(k))
          ? Object.entries(o).map(([k, v]) => fix(v))
          : Object.fromEntries(Object.entries(o).map(([k, v]) => [k, fix(v)]))
        : o;
    
    const fixed = fix(data);
    
    console.log(fixed);
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

    • 请注意,如果输出数组的顺序必须与原始对象中的键匹配,那么如果以更改键顺序的方式操作对象,这可能会或可能不会起作用。
    • @cbr 对象键顺序始终按数字顺序从 0 -> MAX_SAFE_INTEGER 开始。写入时顺序无关紧要。
    • 哦,真的吗?谢谢!我不知道!
    • @cbr 类似整数的键的迭代总是ascending
    【解决方案2】:

    如果我们假设对象的键总是从 0 开始并且是连续的(中间没有丢失的数字),您可以只使用 Object.entries()(或 Object.keys() 和索引)来获取键和值并填充他们的数组:

    const obj = {
      "0": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "CORE"
      },
      "1": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "US"
      },
      "2": {
        "buildVersion": {
          "0": "6.15.1",
          "1": "6.16.2"
        },
        "market": "CA"
      }
    }
    
    const numberedObjectToArray = (obj) => {
      // Assuming `obj` has contiguous index numbers starting from 0
      return Object.entries(obj).reduce((arr, [key, value]) => {
        const index = parseInt(key, 10);
    
        arr[index] = value;
        return arr;
      }, []);
    };
    
    const array = numberedObjectToArray(obj).map(({ buildVersion, ...o }) => ({
      ...o,
      buildVersion: numberedObjectToArray(buildVersion)
    }));
    
    console.log(array);

    【讨论】:

    • 非常感谢,您节省了我的时间。
    【解决方案3】:

    object = {
      "0": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "CORE"
      },
      "1": {
        "buildVersion": {
          "0": "6.15",
          "1": "6.16"
        },
        "market": "US"
      },
      "2": {
        "buildVersion": {
          "0": "6.15.1",
          "1": "6.16.2"
        },
        "market": "CA"
      }
    };
    
    let output = [];
    
    for (let okey in object) {
        let market = object[okey].market;
      let build = object[okey].buildVersion;
      let buildVersion = [];
      for (let bkey in build){
        buildVersion.push(build[bkey]);
      }
      
      output.push({
       market,
        buildVersion
      });
    }
    
    console.log(output);

    【讨论】:

      【解决方案4】:

      var obj= {
        "0": {
          "buildVersion": {
            "0": "6.15",
            "1": "6.16"
          },
          "market": "CORE"
        },
        "1": {
          "buildVersion": {
            "0": "6.15",
            "1": "6.16"
          },
          "market": "US"
        },
        "2": {
          "buildVersion": {
            "0": "6.15.1",
            "1": "6.16.2"
          },
          "market": "CA"
        }
      }
      const output=[];
      Object.values(obj).map(function(curr){
        const {buildVersion,market}= curr;
        output.push({
          market:market,
          buildVersion:Object.values(buildVersion)
        })
      });
      console.log(output);

      `

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多