繁体   English   中英

如何检查一个数组中的值是否在单独的数组中,然后将其转换为新值后返回这些值

[英]How do I check if values in one array feature in a separate array, and then if they do, return those values after converting them each to new values

我有一个ID编号的数组,第二个数组带有这些ID编号的名称。 然后,我有了第三个数组,该数组将仅包含一些ID号。 我想要做的是对照包含所有ID的第一个数组检查第三个数组中的值。 然后,我想返回的第一个数组和第三个数组中的ID作为第二个数组中的匹配名称返回,第二个数组中的ID具有第一个数组中ID的名称。

let seriesIDs = [ 5862, 5869, 5865, 5883, 5884, 5887 ];
let seriesNames = [ '9XM', '9XE', '8XE', '8XT', '8XEP', '2NX' ];
seriesIDs = seriesNames;

let thirdArray = [ 5869, 5865 ]; 

(这些值不会事先知道。我将遍历第三个数组,并检查上面名为seriesIDs的数组中的哪些值)

我需要循环thirdArray,然后再对thirdArray中的值进行检查,以检查数组seriesID,并且该数组中的匹配值应触发数组seriesNames中对应名称的返回。

因此,例如,如果thirdArray包含值[5869、5865],那么我想要返回的将是“ 9XE”和“ 8XE”

有人可以帮忙吗?

我要做的是从两个数组切换到一个对象。 而不是说:

let seriesIDs = [ 5862, 5869, 5865, 5883, 5884, 5887 ];
let seriesNames = [ '9XM', '9XE', '8XE', '8XT', '8XEP', '2NX' ];

我会做:

const seriesMap = {
    5862: '9XM',
    5869: '9XE',
    ...
    5887: '2NX'
};

然后,您只需通过索引器运算符检查名称即可:

const firstName = seriesMap[thirdArray[0]];
const secondName = seriesMap[thirdArray[1]];

无论如何,如果您无法使用这种解决方案。 您可以这样做:

let seriesIDs = [ 5862, 5869, 5865, 5883, 5884, 5887 ];
let seriesNames = [ '9XM', '9XE', '8XE', '8XT', '8XEP', '2NX' ];
let thirdArray = [ 5869, 5865 ]; 

const names = [];
for(const id of thirdArray) {
    const idx = seriesIDs.indexOf(id);
    if(idx !== -1) {
        names.push(seriesNames[idx]);
    }
}

console.log(names);

有用的第一步是创建一个成对的阵列

  • [5862, '9XM']
  • [5869, '9XE']

来自两个数组。 您可以通过根据一个数组的索引将一个数组中的每个元素映射到该对,然后从该操作中创建一个函数并将其称为zip

const zip = (a, b) => a.map((x, i) => [x, b[i]]);

成对数组正是Map构造函数想要的:

const namesByID = new Map(zip(seriesIDs, seriesNames));

Map将允许您通过ID查找姓名。 (例如: namesByID.get(5887) === '2NX' 。)

从那里,将您的ID数组转换为一个名称(在地图中找到的ID)或undefined s(当键不存在时Map#get返回的内容)的数组:

thirdArray.map(id => namesByID.get(id))

并取出undefined s:

thirdArray
    .map(id => namesByID.get(id))
    .filter(name => name !== undefined)

 const zip = (a, b) => a.map((x, i) => [x, b[i]]); const seriesIDs = [5862, 5869, 5865, 5883, 5884, 5887]; const seriesNames = ['9XM', '9XE', '8XE', '8XT', '8XEP', '2NX']; const namesByID = new Map(zip(seriesIDs, seriesNames)); const thirdArray = [5869, 5865]; console.log( thirdArray .map(id => namesByID.get(id)) .filter(name => name !== undefined) ); 

你可以试试


seriesIDs.map((id, index) => thirdArray.includes(id) && seriesNames[index]).filter(item => item)

使用seriesIDsseriesNames创建一个对象查找,然后使用array#map获得每个系列ID的系列名称。

 let seriesIDs = [ 5862, 5869, 5865, 5883, 5884, 5887 ], seriesNames = [ '9XM', '9XE', '8XE', '8XT', '8XEP', '2NX' ], thirdArray = [ 5869, 5865 ], lookup = Object.assign(...seriesIDs.map((v,i) => ({[v]: seriesNames[i]}))), result = thirdArray.map(v => lookup[v]); console.log(result); 
 .as-console-wrapper {max-height: 100% !important; top: 0;} 

而不是更好地维护2个数组,而是创建一个对象数组。 即:

let serialIDs=[{id:5862, name:'9XM'},{id:5869, name:'9XE'},{id:5865, name:'8XE'},{id:5883, name:'8XT'},{id:5884, name:'8XEP'},{id:5887 , name:'2NX'}];

然后进行过滤:

serialIDs.filter(function(item) {  return thirdArray.includes(item.id); });  // It will return filtered array

这是一个解决方案

存在相应ID时保留名称

 const selectIDs = (seriesIDs, seriesNames, ids) => seriesNames.filter((_, i) => ids.includes(seriesIDs[i])) const seriesIDs = [ 5862, 5869, 5865, 5883, 5884, 5887 ]; const seriesNames = [ '9XM', '9XE', '8XE', '8XT', '8XEP', '2NX' ]; const thirdArray = [ 5869, 5865 ] console.log(selectIDs(seriesIDs, seriesNames, thirdArray)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM