Javascript中的Map和Filter映射数组

时间:2018-12-17 14:33:45

标签: javascript

这是一个非常简单的问题。我想映射并形成给定另一个数组的数组。那么我想删除重复的值。

这就是我所做的:

public ActionResult Index(string aidYear)
    {
        aidYear = string.IsNullOrEmpty(aidYear) ? new FinAidYear().GetCurrentYear() : aidYear;

        string username = User.Identity.Name;
        if (!Authorization.CheckUsernameDept(username))           
            return RedirectToAction("NotAuthorized", "Account");

        var user = new UserStore().GetUser(username);
        var aidYears = new AidYearStore().GetAidYears();
        var scholarships = new ScholarshipStore().GetScholarships(user.DeptCode, aidYear);
        var availableScholarships = scholarships.Where(x => x.AmountTotal > x.AmountRequested);
        var terms = new TermStore().GetAllTerms();

        var requestVM = new RequestViewModel
        {
            AidYear = aidYear,
            AidYears = aidYears,
            User = user,
            Scholarships = scholarships,
            AvailScholarships = availableScholarships,
            Terms = terms
        };

        return View(requestVM);
    }

有效。但是我想要一个不涉及编写两个代码块的解决方案。我尝试过:

let status = listHotels.map(hotel => {
  return hotel.status
})

const x = status.filter((v, i) => (
  status.indexOf(v) === i
));

但是它没有用。它说

  

无法读取未定义的属性'indexOf'

有人知道解决方法吗?

4 个答案:

答案 0 :(得分:5)

调用.filter方法时,仍未定义

状态。

将其更改为:

let status = listHotels.map(hotel => {
  return hotel.status
}).filter((v, i, currentStatus) => (
  currentStatus.indexOf(v) === i
));

答案 1 :(得分:2)

您可以使用findIndex,传递一个用于比较状态的函数并在以下位置交换过滤器/地图来做到这一点:

const listHotels = [{status: 'bad'}, {status: 'good'}, {status: 'bad'}];

let status = listHotels.filter((v, i) =>
  listHotels.findIndex(v2 => v.status === v2.status) === i
).map(hotel => hotel.status);

console.log(status);

答案 2 :(得分:1)

状态尚未准备好(undefined)可以访问filter()内部。但是在第一种解决方案中, map()返回结果并将结果存储在 status 中,这将使变量在以后的语句中可用。

您可以将数组本身作为第三个参数传递给filter()。您也不需要在这里使用不必要的 return 语句:

var listHotels = [{status:'a'}, {status:'b'}, {status:'a'}]

let status = listHotels.map(hotel => hotel.status)
                       .filter((v, i, arr) => arr.indexOf(v) === i);
console.log(status);

答案 3 :(得分:0)

由于您使用的是letconst,所以我假设您也可以使用ES6 Set

const data = [{
  status: 'one',
  id: 1
}, {
  status: 'one',
  id: 2
}, {
  status: 'two',
  id: 3
}, {
  status: 'two',
  id: 4
}]

const uniqueStatus = [...new Set(data.map(({
  status
}) => status))]

console.log(uniqueStatus)

将映射的数组传递到Set将确保唯一性。您可以将Set分解为数组。