首页 > 解决方案 > 我需要创建一个函数,该函数返回由“名称”索引的纯 JavaScript 字符串,并包含所有“道具”

问题描述

我的代码似乎是正确的,但它在 Json 结果的某些位置没有返回“:”而是“,”。请在代码注释中查看所需的结果。

我也不喜欢我为从 Json 表达式中删除数组括号而编写的“替换”,我不应该修改 JSON 字符串。有没有更优雅的方法来做到这一点?

    // JSON Object  
    var items  = [
      {
        name: "item 1",
        id: 2,
        props: {
          a: "a prop1",
          b: "b prop1",
        },
        values: [1, 2, 3],
      },
      {
        name: "item 2",
        id: 3,
        props: {
          a: "a prop2",
          b: "b prop2",
        },
        values: [6, 1, 2, 3, 4],
      },
      {
        name: "item 3",
        id: 4,
        props: {
          a: "a prop3",
          c: "c prop3",
        },
        values: [10, 1, 2, 3, 4, 5],
      },
    ];

    export function getObject(items) {
    
    var arr = [];
    
      for(var i in items){
        arr.push(items[i].name);
        arr.push(items[i].props);
      }
    
      var myJSON = JSON.stringify(arr).toString();
      
      var test = myJSON.replace("[","{").replace("]","}"); // I couldn't find another way to extract the array data from the array brackets.
      
      var test2 = JSON.stringify(test);
    
    // test2 is returning: "{\"item 1\",{\"a\":\"a prop1\",\"b\":\"b prop1\"},\"item 2\",{\"a\":\"a prop2\",\"b\":\"b prop2\"},\"item 3\",{\"a\":\"a prop3\",\"c\":\"c prop3\"}}"  
    // but it's expected:  "{\"item 1\":{\"a\":\"a prop1\",\"b\":\"b prop1\"},\"item 2\":{\"a\":\"a prop2\",\"b\":\"b prop2\"},\"item 3\":{\"a\":\"a prop3\",\"c\":\"c prop3\"}}"
          
       return test2;
    }

标签: javascriptarraysjson

解决方案


用于.map将每个项目转换为一个对象,该对象具有一个属性,其键是item.name,值是item.props对象:

const getObject = items => items.map(item => ({ [item.name]: item.props }));

// JSON Object  
var items = [{
    name: "item 1",
    id: 2,
    props: {
      a: "a prop1",
      b: "b prop1",
    },
    values: [1, 2, 3],
  },
  {
    name: "item 2",
    id: 3,
    props: {
      a: "a prop2",
      b: "b prop2",
    },
    values: [6, 1, 2, 3, 4],
  },
  {
    name: "item 3",
    id: 4,
    props: {
      a: "a prop3",
      c: "c prop3",
    },
    values: [10, 1, 2, 3, 4, 5],
  },
];


console.log(getObject(items));

如果你真的需要一个 JSON 字符串而不是一个对象,那么把JSON.stringify它放在周围。(请记住:没有“JSON 对象”之类的东西。)

const getObject = items => JSON.stringify(items.map(item => ({ [item.name]: item.props })));

// JSON Object  
var items = [{
    name: "item 1",
    id: 2,
    props: {
      a: "a prop1",
      b: "b prop1",
    },
    values: [1, 2, 3],
  },
  {
    name: "item 2",
    id: 3,
    props: {
      a: "a prop2",
      b: "b prop2",
    },
    values: [6, 1, 2, 3, 4],
  },
  {
    name: "item 3",
    id: 4,
    props: {
      a: "a prop3",
      c: "c prop3",
    },
    values: [10, 1, 2, 3, 4, 5],
  },
];


console.log(getObject(items));


推荐阅读