React:使用不同的键映射多维数组

时间:2017-10-31 13:04:11

标签: javascript reactjs ecmascript-6

如何使用不同的键映射多维数组? 这是一个类似的示例数组:(我的原始数组是从ajax和PHP mysql查询获得的,这就是我需要这样做的原因):

var products = [
        {
            id: 1,
            name: 'John',
            phones: {
                sony:
                {
                  brand: 'sony',
                  model: 'z3'
                },
                samsung:
                {
                  brand: 'samsung',
                  model: 's7'
                }
              }

        },
        {
            id: 2,
            name: 'Mike',
            phones: {
                sony:
                {
                  brand: 'sony',
                  model: 'z1'
                },
                nokia:
                {
                  brand: 'nokia',
                  model: 'n8'
                }
              }

        }
      ];

如果我尝试映射此数组,我会得到:'未捕获TypeError:product.phones.map不是函数':

const List = ({ products, addToCart }) => { 

  return (
    <div className="odds-3">
      <div className="odds">

        {products.map((product, index) =>
          <div key={index}>
            <p>{product.id} - {product.name}</p>
            <ul>
              {product.phones.map((phone, index) =>

                <li key={index}>{phone.brand} - {phone.model}</li>

              )}
            </ul>
          </div>
        )}
      </div>
    </div>
  );

}

使用此阵列(没有电话键),工作正常:

 var products = [
            {
                id: 1,
                name: 'John',
                phones:
                    [{
                      brand: 'sony',
                      model: 'z3'
                    },
                    {
                      brand: 'samsung',
                      model: 's7'
                    }
                  ]
            },
            {
                id: 2,
                name: 'Mike',
                phones:
                    [{
                      brand: 'sony',
                      model: 'z1'
                    },
                    {
                      brand: 'nokia',
                      model: 'n8'
                    }
                  ]
            }
          ];

4 个答案:

答案 0 :(得分:3)

products不是数组,因此map函数无法正常工作。试试

{Object.keys(product.phones).map((phone, index) =>
 <li key={index}>{product.phones[phone].brand} - {product.phones[phone].model}</li>
)}

代替。

答案 1 :(得分:0)

在您的第一个示例中,手机属性为object而不是array,因此没有map功能

第二个作品phonesarray

答案 2 :(得分:0)

正如我之前的其他人告诉你的那样,products不是一个数组,因此你无法在其上使用地图功能。

尽管如此,您可以使用map库中的lodash函数来迭代对象键/值:

import map from 'lodash'
{map(product, (value, key) =>
 ...
)}

有关详情,请参阅here

答案 3 :(得分:0)

在JavaScript中,数组的工作方式略有不同。在您的情况下,插入修复将迭代对象的值,如下所示:

{products.map((product, index) =>
    <div key={index}>
        <p>{product.id} - {product.name}</p>
        <ul>
            {Object.values(product.phones).map((phone, index) =>
            <li key={index}>{phone.brand} - {phone.model}</li>
            )}
        </ul>
    </div>
)}

虽然有些浏览器仍然不支持Object.values(),但是转换步骤应该解决这个问题。

请注意,通常不建议使用索引作为键,因为如果迭代的排序或内容发生变化,您可能会得到weird rendering bugs