【问题标题】:JavaScript Filter Method - Return only first objectJavaScript 过滤方法 - 只返回第一个对象
【发布时间】:2018-10-05 05:29:11
【问题描述】:

在 JavaScript 中使用 filter() 方法,是否可以只返回第一个通过测试的实例?在我的汽车数组中找到第一个对象后,我想将此对象从其当前位置移动到汽车数组的开头。

代码:

     cars.filter(function(car) {

        var fareType = car.data("fareType");
        var partnerCode = car.data("partnerCode");

        if (fareType == "DEAL" && partnerCode == "AV")
        {
            // get first instance only and move element to beginning of array
        }

        if (fareType == "DEAL" && partnerCode == "BU")
        {
            // also get first instance where partnerCode == BU only and move element to beginning of array 
           // If dataPrice is less than dataPrice for partner AV, move to first position, else move to second position
        }
    });

【问题讨论】:

  • @OriDrori findIndex 更好,因为他需要索引,而不仅仅是值。

标签: javascript arrays sorting methods refactoring


【解决方案1】:

我会使用.findIndex.splice

let index = cars.findIndex(function(car) {
    var fareType = car.data("fareType");
    var partnerCode = car.data("partnerCode");
    return (fareType == "DEAL" && partnerCode == "AV");
});
if (index !== -1) {
    let car = cars[index];
    cars.splice(index, 1);
    cars.unshift(car);
    /*
     * this could be reduced to:
     *
     *     cars.unshift(...cars.splice(index, 1));
     *
     * at the sake of clarity
     */
}

index = cars.findIndex(function(car) {
    return fareType == "DEAL" && partnerCode == "BU";
});
if (index !== -1) {
    let car = cars[index];
    cars.splice(index, 1);
    if (car.data('price') < cars[0].data('price')) {
        cars.unshift(car);
    } else {
        cars.splice(1, 0, car);
    }
}

【讨论】:

  • 谢谢戴夫!我刚刚更新了我的问题并进行了跟进。在获得 AV Deal 的 firstPosition 后,我还需要查找 partnerCode == BU 的元素。根据哪个价格更便宜(AV 与 BU),我要么必须将其移动到第一或第二位置(在 AV 之前,反之亦然)。我可以使用 findIndex 来实现吗?在这种情况下我需要使用多个 findIndex 吗?
  • 您可以再次运行基本上相同的代码,但需要检查一下插入它的位置。见编辑
  • 太棒了,这太完美了。谢谢! :)
【解决方案2】:

你可以这样做:

let indexToGoFirst = 0;

cars.some((car, index) => {
  const fareType = car.data('fareType');
  const partnerCode = car.data('partnerCode');

  if (fareType == 'DEAL' && partnerCode == 'AV') {
    indexToGoFirst = index;
    return True
  }
})

cars[0] = cars[indexToGoFirst];

.some() 检查数组中是否有任何匹配条件,并在满足条件时停止循环,因此您可以使用它来设置第一个元素。

【讨论】:

    【解决方案3】:

    您可以使用findIndex()

    var selectedIndex = cars.findIndex(function(car) {
        return car.data("fareType")== "DEAL" && car.data("partnerCode")== "AV";
    });
    
    if (selectedIndex > -1) {
       cars = [cars[selectedIndex], ...cars.slice(0, selectedIndex), ...cars.slice(selectedIndex + 1)
    }
    

    【讨论】:

    • 如果重要,这会创建一个新数组,而不是修改原始的cars 数组。
    【解决方案4】:

    查找索引并以元素为先创建新数组

    var index = cars.findIndex(function(car) {
            var fareType = car.data("fareType");
            var partnerCode = car.data("partnerCode");
    
            // get first instance only and move element to beginning of array
    
            return fareType == "DEAL" && partnerCode == "AV";
    
        });
    
    var newCars = index > 0? [cars[index]].concat(cars.slice(0, index)).concat(cars.slice(index + 1): cars; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2021-02-26
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2014-05-22
      相关资源
      最近更新 更多