Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问与数组中的项同名的对象--Javascript_Javascript_Arrays_Object_Javascript Objects - Fatal编程技术网

访问与数组中的项同名的对象--Javascript

访问与数组中的项同名的对象--Javascript,javascript,arrays,object,javascript-objects,Javascript,Arrays,Object,Javascript Objects,请参阅下面的更新 我有一个具有以下值的数组: tablet, desktop, widescreen, fullhd 我也有同名的对象。我试图创建一个forEach循环,该循环将使用数组中的不同名称来访问同名对象上的某些属性。大概是这样的: ['tablet', 'desktop', 'widescreen', 'fullhd'].forEach(type => { css`@media screen and (min-width: ${breakpoints[type]

请参阅下面的更新

我有一个具有以下值的数组:

tablet, desktop, widescreen, fullhd
我也有同名的对象。我试图创建一个forEach循环,该循环将使用数组中的不同名称来访问同名对象上的某些属性。大概是这样的:

  ['tablet', 'desktop', 'widescreen', 'fullhd'].forEach(type => {
      css`@media screen and (min-width: ${breakpoints[type]}) {
        color: ${type[color]};
        background-color: ${type[bg]};
      }
    `;
  })}
问题是当我尝试访问类型[color]或类型[bg]时。在本例中,我尝试使用type来引用一个名为tablet或desktop等的对象。但是,我尝试使用字符串tablet、desktop等来引用,但这不起作用

所以,这是我的问题

如何重写代码,以便循环数组的值以访问同名对象上的相关属性

更新

这是我的全部代码。但是,在展示代码之前,我应该注意,在这个特定示例中,我使用的是ReactJS和样式化组件。然而,据我所知,这个问题与React或样式化组件无关——这是一个纯Javascript问题:

首先,断点对象:

const breakpoints = {
  tablet: "769px",
  desktop: "1024px",
  widescreen: "1216px",
  fullhd: "1408px"
};
其次,我根据该对象的关键点创建了一个数组:

const breakpointKeys = Object.keys(breakpoints);
第三,我创建了一个函数,使用该数组尝试访问另一个对象,具体如下:

const gridCSS = ({ bg, color, tablet }) => css`
  background-color: ${bg};
  color: ${color};
  ${breakpointKeys.forEach(key => {
    css`
      @media screen and (min-width: ${breakpoints[key]}) {
        color: ${key[color]};
        background-color: ${key[bg]};
      }
    `;
  })}
第四,我创建了一个使用该函数${gridCSS}的样式化组件:

第五,我创建了一个带有许多道具的React组件,特别是平板电脑和桌面道具:

道具平板电脑和桌面是我试图从我的断点数组访问的对象。

您可以使用eval:


我想出了一个有效的解决办法。代码如下:

const gridCSS = ({ bg, textColor, ...props }) => {
  let mediaQueryCSS = breakpointKeys.map(key => {
    let mediaQuery = breakpoints[key].value + breakpoints[key].unit;

    return css`
      @media screen and (min-width: ${mediaQuery}) {
        color: ${props[key] && props[key].textColor};
        background-color: ${props[key] && props[key].bg};
      }
    `;
  });

  return css`
    background-color: ${bg};
    color: ${textColor};
    ${mediaQueryCSS};
  `;
};
从forEach更改为map与样式化组件相关

我认为这样做的原因是,我没有破坏道具对象的道具,而是引用道具,然后引用道具的键,正如“代码狂人”在评论中所指出的那样。这样,我不是用字符串调用对象,而是用字符串调用对象的属性


无论哪种方式,它都可以工作。

您应该像下面这样访问该对象的值,对象[type][bg]?您能展示一下您的对象的外观吗?使用eval获取对象怎么样。类似于:让obj=evaltype;e、 g.拥有一个具有这些名称的属性的对象,该对象充当索引。const index={平板电脑、桌面、宽屏、全高清};索引[类型][颜色];那么为什么不在数组中加入对象呢?而不是字符串,或者在该数组旁边。这样,传入.forEach回调的索引值就可以用来访问实际对象。${key[color]}无效。向断点对象添加颜色,并使用table:{bp:769px,color:red,…}执行${breakpoints[key].color}等操作
function App() {
  return (
    <Grid
      color="orange"
      bg="lightgreen"

      tablet={{
        color: "green",
        bg: "orange"
      }}

      desktop={{
        color: "yellow",
        bg: "purple"
      }}
    >
      <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
      </div>
    </Grid>
  );
}
eval(type).color
eval(type).bg
const gridCSS = ({ bg, textColor, ...props }) => {
  let mediaQueryCSS = breakpointKeys.map(key => {
    let mediaQuery = breakpoints[key].value + breakpoints[key].unit;

    return css`
      @media screen and (min-width: ${mediaQuery}) {
        color: ${props[key] && props[key].textColor};
        background-color: ${props[key] && props[key].bg};
      }
    `;
  });

  return css`
    background-color: ${bg};
    color: ${textColor};
    ${mediaQueryCSS};
  `;
};