簡體   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