【问题标题】:Access inner Object and form Jsx访问内部对象并形成 Jsx
【发布时间】:2020-10-13 03:16:48
【问题描述】:

我有两组对象

const obj1 = {
    men: {
      value: "men",
      attribute_label: "Men",
      type: "select",
      attribute_options: {
        1: { label: "infant", value_string: "1" },
        2: { label: "baby", value_string: "2" }
      }
    },
    women: {
      value: "women",
      attribute_label: "Women",
      type: "select",
      attribute_options: {
        1: { label: "infant", value_string: "1" },
        2: { label: "baby", value_string: "2" }
      }
    },
    kids: {
      value: "kids",
      attribute_label: "Kids",
      type: "select",
      attribute_options: {
        7: { label: "infant", value_string: "1" },
        8: { label: "baby", value_string: "2" }
      }
    }
  };

和设置2

const obj2 = {
men: { code: "men", title: "Men" },
women: { code: "men", title: "Men" }
};

我想比较这两个对象集,如果键相同,我想将结果作为新对象获得

    const resultobj = {
     men: {
  value: "men",
  attribute_label: "Men",
  type: "select",
  attribute_options: {
    1: { label: "infant", value_string: "1" },
    2: { label: "baby", value_string: "2" }
  }
},
women: {
  value: "women",
  attribute_label: "Women",
  type: "select",
  attribute_options: {
    1: { label: "infant", value_string: "1" },
    2: { label: "baby", value_string: "2" }
  }
}
    };

我想从结果 obj 中显示标签并在选项中显示标签。我在 Men 中有标签,在选项里面我有其他 2 个标签的男孩和家伙。在女性的情况下也是如此。所以我也想在选项中显示值。我已经提到的示例格式。

Men 

boy Guy

Women

Lady  Girl

【问题讨论】:

  • 我不知道我是否理解,您想创建一个新对象,其中键在前两个对象中是通用的?你应该拿哪个对象,来自 set1 或 set2 的那个?还是组合?
  • 是的。我也想在选项中显示标签和值
  • 您的输入仍然无效 ("options": 1: {label: "boy")。发布可编译代码是绝对最低要求。任何代码编辑器都会突出显示对象文字中的错误。
  • @Rspp ("options":1:{label:"boy"}) isn't a valid object syntax in js 你的意思是 options 是一个数组吗?
  • 在数组中是。在创建对象格式时我错过了它

标签: javascript reactjs


【解决方案1】:

const set1 = {
          men: {value: 'men',label: 'Men',type: 'select',
        options: [
          { 1: { label: 'boy', value_string: '1' } },
          { 2: { label: 'Guy', value_string: '2' } },
        ],
      },
      women: {value: 'women',label: 'Women',type: 'select',
        options: [
          { 1: { label: 'lady', value_string: '1' } },
          { 2: { label: 'girl', value_string: '2' } },
        ],
      },
      kids: {value: 'kids',label: 'Kids',type: 'select',
        options: [
          { 1: { label: 'infant', value_string: '1' } },
          { 2: { label: 'baby', value_string: '2' } },
        ],
      },
        };

const set2 = {
  men: { code: "men", title: "Men" },
  women: { code: "Women", title: "Women" },
};



let keys = Object.keys(set1).filter(key => key in set2)

let result = {} 
keys.forEach((key)=>{
      result = {...result,...{[key]:set1[key]}}
})

console.log(result)

用于显示标签

{Object.keys(result).map(key => {
    return (
      <Fragment key={key}>
        <h3>{result[key].attribute_label}</h3>
        {Object.values(result[key].attribute_options).map(option => (
          <span key={option.value_string} style={{ paddingRight: "10px" }}>
            {option.label}
          </span>
        ))}
      </Fragment>
    );
  })}

工作链接https://codesandbox.io/s/winter-dream-x3vi7?file=/src/App.js

【讨论】:

  • @Rspp 我已经添加了我的答案
  • 当我签入浏览器控制台时,选项如下options: {1: {…}, 2: {…}}。当我展开它时,它会显示 options: 1: {label: "boy", value_string: "1"} 2: {label: "Guy", value_string: "2"} 。当我扩展它时,我得到它:options: 1: {label: "boy", value_string: "1"} 2: {label: "Guy", value_string: "2"}。那么对于这种情况,上面的代码会起作用吗? @aravind_reddy
  • 我收到此错误 ** attribute_options.map 不是函数**
  • @Rspp 我已经更新了答案,这是有效的 sanbox 链接codesandbox.io/s/winter-dream-x3vi7?file=/src/App.js
  • 如果您可以使用与此处更相关的正确数据 bcz 更新问题会更好......我也编辑了您的问题
【解决方案2】:

options 视为一个对象数组,您可以使用以下实用程序从set1 中获取set2 的匹配项。

const set1 = {
  men: {
    value: 'men',
    label: 'Men',
    type: 'select',
    options: [
      { 1: { label: 'boy', value_string: '1' } },
      { 2: { label: 'Guy', value_string: '2' } },
    ],
  },
  women: {
    value: 'women',
    label: 'Women',
    type: 'select',
    options: [
      { 1: { label: 'lady', value_string: '1' } },
      { 2: { label: 'girl', value_string: '2' } },
    ],
  },
  kids: {
    value: 'kids',
    label: 'Kids',
    type: 'select',
    options: [
      { 1: { label: 'infant', value_string: '1' } },
      { 2: { label: 'baby', value_string: '2' } },
    ],
  },
}

const set2 = {
  men: { code: 'men', title: 'Men' },
  women: { code: 'men', title: 'Men' },
}

let finalObj = Object.keys(set2).reduce((result, key) => {
  result[key] = set1[key]
  return result
}, {})

console.log(finalObj)

这里finalObj 将包含结果对象,您可以使用它在 UI 中显示标签。

这里是 link 在 React 应用程序中显示的工作示例。我刚刚创建了一个示例应用程序,我在其中使用了该实用程序来格式化数据,并使用相同的数据以您想要的方式显示。

希望这会有所帮助。

【讨论】:

  • 但我想在选项中获取标签,以便从最终对象中显示。男人和低于选项男孩盖伊的标签
  • 我添加了沙箱链接,用于以您想要的方式显示标签。请看here
  • 当我签入浏览器控制台时,选项如下options: {1: {…}, 2: {…}}。当我展开它时显示`选项:1:{label:“boy”,value_string:“1”} 2:{label:“Guy”,value_string:“2”}`。当我扩展它时,我得到它:options: 1: {label: "boy", value_string: "1"} 2: {label: "Guy", value_string: "2"} 。那么对于这种情况,上面的代码会起作用吗? @Nithish
  • 在你提到的问题中 options 是一个 array of objects 。但是在您分享的链接中,您使用了attribute_options 作为对象。你能告诉我们你输入的结构吗?只有这样我们才能为您提供帮助。
【解决方案3】:

我可以在这里帮助您比较对象,您可以先获取对象的条目并应用过滤器,然后在其中查看键是否包含在第二个对象中。完成后您可以使用Object.fromEntries 创建新对象。这是工作示例:

var set1 = {
  men: { value: "men", label: "Men", type: "select", "options": [ {label: "boy", value_string: "1"}, {label: "Guy", value_string: "2"}] },
  women: { value: "women", label: "Women", type: "select", "options": [ {label: "lady", value_string: "1"} , {label: "girl", value_string: "2"}] },
  kids: { value: "kids", label: "Kids", type: "select" ,"options": [ {label: "infant", value_string: "1"} , {label: "baby", value_string: "2"}] },
};

var set2 = {
  men: { code: "men", title: "Men" },
  women: { code: "men", title: "Men" },
};

var filteredObj = Object.fromEntries(Object.entries(set1).filter(([k,v])=>Object.keys(set2).includes(k)));

console.log(filteredObj);

【讨论】:

  • 我也想在选项中显示标签。预计像这个男人男孩家伙
  • @Rspp 您可以编辑您的问题并以 JSON 形式向我们展示预期的输出。
  • @Rspp 如果我理解正确,您需要在选项中显示value { label: 'boy', value_string: '1' , value:'men'},对吧?
  • 没有。不是这样的 。在 jsx 中,如果我返回
    {resultobj.label}
    给出标签(男性)。但也想返回选项标签。
  • 根据您的回答将获得最终输出 filtersObj 。那是正确的。现在我想显示选项内的值。在选项里面我有标签。标签中的那个值
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多