在数组字段中查找数组

时间:2019-05-20 16:11:55

标签: arrays angular

如何通过某些也包含数组的数组找到某些内容? 更准确地说:

enter image description here

我想从coaches数组返回与用户名匹配的id(coach内)。我尝试过的:

  if (!(args['coach'].value === '') && (args['coach'].value !== null)) {
    coachId = this.items.find(x => x.username === args.coach.value).id;
  }

基本上this.items是我以前console.log的内容。现在它给了我不确定的信息。

有人为此解决了吗?非常感谢。

[
   {
      "id":584,
      "name":"Name",
      "coaches":[
         {
            "id":8587,
            "username":"test"
         },
         {
            "id":8589,
            "username":"test1"
         }
      ]
   },
   {
      "id":587,
      "name":"O1",
      "coaches":[

      ]
   }
]

假设我们要在搜索名称8587时返回ID test

4 个答案:

答案 0 :(得分:3)

合并mapfind

const array = [
  [{a1: 1},
   {a2: 2}
  ],
  [{a1: 1},
   {a2: 2},
   {a3: 3}]
];

const element = array.map(innerArray => {
  const found = innerArray.find(el => el.a1 === 1);
  if (found) return found.a1;
  return null;
}).find(el => el !== null);

console.log(element) // 1

答案 1 :(得分:3)

要查找多个匹配项,请执行以下操作:

const data = [{
    "id": 584,
    "name": "Name",
    "coaches": [{
        "id": 8587,
        "username": "test"
      },
      {
        "id": 8589,
        "username": "test1"
      }
    ]
  },
  {
    "id": 587,
    "name": "O1",
    "coaches": [

    ]
  }
];

const usernameToSearch = 'test1';

const foundCoachIds = data
  .reduce((acc, curr) => {

    // Destructure the coaches property first
    const {
      coaches,
      ...rest
    } = curr;

    // Check if any username matches the coach
    const foundMatches = coaches.filter(x => x.username === usernameToSearch);

    // If there is any found match push into accumulator
    if (foundMatches.length) {
      for (const foundMatch of foundMatches) {
        if (acc.indexOf(foundMatch.id) === -1) {
          acc.push(foundMatch.id);
        }
      }
    }

    return acc;
  }, []);

console.log(foundCoachIds);

答案 2 :(得分:2)

const data = [
   {
      "id":584,
      "name":"Name",
      "coaches":[
         {
            "id":8587,
            "username":"test"
         },
         {
            "id":8589,
            "username":"test1"
         }
      ]
   },
   {
      "id":587,
      "name":"O1",
      "coaches":[

      ]
   }
];   

用于外部ID

data.map(it => {return !!it.coaches.find(it2 => it2.username == "test") ? it.id : null}).filter(it=>!!it)

evaluates to [584]

对于内部 (教练)id:

data.map(it => it.coaches.find(it2 => it2.username == "test")).filter(it => !!it).map(it=> it.id) 

returns [8587]

只需从这些书中选出第一项即可得到答案。

答案 3 :(得分:2)

let y = this.items.filter(o => o.coaches.some(e => e.username === 'test'))[0]
            .coaches.filter(e=>e.username === 'test')[0].id;

console.log(y);