如何改进这个JS数组搜索功能?

时间:2018-03-22 02:36:20

标签: javascript arrays ecmascript-6 lodash

我有以下功能:

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创建类似版本以重新排序整个数组?

3 个答案:

答案 0 :(得分: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());
&#13;
&#13;
&#13;

请注意,您的functionName key的当前参数在您的代码段中未使用,我不确定它的用途。

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

答案 1 :(得分:0)

您可以使用数组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);

答案 2 :(得分:0)

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);