【问题标题】:How can I refine this JS array search function?如何优化这个 JS 数组搜索功能?
【发布时间】:2018-03-22 02:36:19
【问题描述】:

我有以下功能:

export const functionName = (key) => {
  const data = [
    {
      displayOrder: 0,
      key: 'key-name-1',
    },
    {
      displayOrder: 2,
      key: 'key-name-2',
    },
  ];

  for (let index in data) {
    return data[index].displayOrder === 0
      ? data[index].key
      : data[0].key;
  }
};

该函数的目的是返回具有最低 displayOrder 的key。这行得通,但有没有更好更巧妙的方法来实现这一点?

其次,我怎样才能最好地创建一个类似的版本来根据 displayOrder 重新排序整个数组?

【问题讨论】:

  • 看起来不太对劲。如果数组中有更多项并且数组尚未排序,它是否有效?
  • 您将0 硬编码为最低displayOrder 总是这样吗?或者它可能是 1(或任何数字)是最低的?
  • data.sort((a, b) => a.displayOrder - b.displayOrder)[0] 是正确的……

标签: javascript arrays ecmascript-6 lodash


【解决方案1】:

当您想从数组中提取单个事物(并且您无法使用 .find 单独识别元素)时,使用的正确方法是使用 .reduce

const functionName = () => {
  const data = [
    {
      displayOrder: 0,
      key: 'key-name-1',
    },
    {
      displayOrder: 2,
      key: 'key-name-2',
    },
  ];
  const lowestDisplayObj = data.reduce((lowestObjSoFar, currentObj) => {
    if (currentObj.displayOrder < lowestObjSoFar.displayOrder) return currentObj;
    return lowestObjSoFar;
  }, { displayOrder: Infinity, key: null });
  return lowestDisplayObj.key;
};
console.log(functionName());

请注意,您当前对functionNamekey 的参数在您的 sn-p 中未使用,我不确定它的用途。

您也可以使用 .sort() 并选择数组中的第一个元素,但这比实际需要的计算成本更高。

【讨论】:

  • 这行得通!我剥离了一些逻辑,忘记删除密钥。
【解决方案2】:

您可以使用数组 reduce 并执行以下操作。

const data = [{
    displayOrder: 10,
    key: 'key-name-10',
  },
  {
    displayOrder: 2,
    key: 'key-name-2',
  },
  {
    displayOrder: 1,
    key: 'key-name-1 Lowest',
  }
];


let a = data.reduce((prev, item) => {
  if (!prev) {
    return item;
  }
  return (item.displayOrder < prev.displayOrder) ? item : prev;
});
console.log(a.key);

【讨论】:

    【解决方案3】:

    const data = [
        {
          displayOrder: 0,
          key: 'key-name-1',
        },
        {
          displayOrder: 2,
          key: 'key-name-2',
        },
    ];
    
    const min = Math.min.apply(null, data.map(({displayOrder}) => +displayOrder));
    
    const obj = data.find((obj) => obj.displayOrder == min);
    
    console.log(obj.key);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多