【问题标题】:Compare elements of array比较数组的元素
【发布时间】:2020-11-14 05:34:25
【问题描述】:
var getJSON = require('get-json')

var dateToday = new Date();
var dayToday = dateToday.getDate();
var monthToday = dateToday.getMonth() + 1;
var yearToday = dateToday.getFullYear();

const date = yearToday + "-" + monthToday + "-" + dayToday;

getJSON('https://betwatch.fr/getMoney?choice=Match%20Odds&date=' + date)
    .then(function (response) {

        getJSON('https://betwatch.fr/getMoney?choice=Over%2FUnder%202.5%20Goals&date=' + date)
            .then(function (response2) {

                getJSON('https://betwatch.fr/getMoney?choice=Both%20teams%20to%20Score%3F&date=' + date)
                    .then(function (response3) {

                        const IsEmptyArray = arr => !(typeof (arr) === 'object' && arr instanceof Array && arr.length > 0);

                        const getFieldMap = (arr, field) => {
                            arr = (!IsEmptyArray(arr)) ? arr : [];
                            const result = arr.reduce((result, elm) => {
                                const key = elm[field];
                                if (key) {
                                    result[key] = elm;
                                }
                                return result;
                            }, {});
                            return result;
                        };

                        var array1 = JSON.parse(response);
                        var array2 = JSON.parse(response2);
                        var array3 = JSON.parse(response3);

                        const arr1Map = getFieldMap(array1, 'm');
                        const arr2Map = getFieldMap(array2, 'm');
                        const arr3Map = getFieldMap(array3, 'm');
                        const maxArr = (array1.length > array2.length) ? ((array1.length > array3.length) ? array1 : array2) : ((array2.length > array3.length) ? array2 : array3);

                        delete array1;
                        delete array2;
                        delete array3;

                        const matchingObjects = maxArr.reduce((matchingObjects, ele) => {
                            key = ele.m;
                            if (arr1Map[key] && arr2Map[key] && arr3Map[key]) {
                                ele['n_arr'] = [arr1Map[key]['i'], arr2Map[key]['i'], arr3Map[key]['i']]
                                ele['n_arr_vm'] = [arr1Map[key]['vm'], arr2Map[key]['vm'], arr3Map[key]['vm']]
                                matchingObjects.push(ele);
                            }
                            return matchingObjects;
                        }, [])
                        console.log(matchingObjects);
                    }).catch(function (error) {
                        console.log(error);
                    });
            }).catch(function (error) {
                console.log(error);
            });
    }).catch(function (error) {
        console.log(error);
    });

鉴于这 3 个数组(GOT FROM API),我想检查数组 2 和数组 3 中的 'm'

如果 'm' 在所有三个中都存在,则返回匹配的对象。

我尝试使用循环执行此操作,但我只能获得位置匹配。

示例:FIRST ARRAY 'm' = 尤文图斯 - 罗马出现在所有三个阵列中。

我想从其他两个中派生对象 'i' 始终与示例匹配相对应。

【问题讨论】:

  • 为什么不"Taraji Wadi Al-Nes - Jabal Al Mukaber"?请添加您的代码。
  • 我添加了。从 API 我得到 JSON。如果我与 FOR 循环比较,它只比较位置。

标签: javascript node.js arrays


【解决方案1】:
var getJSON = require('get-json')


const IsEmptyArray = arr => !(typeof (arr) === 'object' && arr instanceof Array && arr.length > 0);

const getFieldMap = (arr, field) => {
  arr = (!IsEmptyArray(arr)) ? arr : [];
  const result = arr.reduce((result, elm) => {
    const key = elm[field];
    if (key) {
      result[key] = elm;
    }
    return result;
  }, {});
  return result;
};

const getMatchingObjects = async () => {

  var dateToday = new Date();
  var dayToday = dateToday.getDate();
  var monthToday = dateToday.getMonth() + 1;
  var yearToday = dateToday.getFullYear();

  const date = yearToday + "-" + monthToday + "-" + dayToday;

  const [array1, array2, array3] = await Promise.all(
    [
      getJSON('https://betwatch.fr/getMoney?choice=Match%20Odds&date=' + date),
      getJSON('https://betwatch.fr/getMoney?choice=Over%2FUnder%202.5%20Goals&date=' + date),
      getJSON('https://betwatch.fr/getMoney?choice=Both%20teams%20to%20Score%3F&date=' + date)
    ]
  )

  const arr1Map = getFieldMap(array1, 'm');
  const arr2Map = getFieldMap(array2, 'm');
  const arr3Map = getFieldMap(array3, 'm');
  const maxArr = (array1.length > array2.length) ? ((array1.length > array3.length) ? array1 : array2) : ((array2.length > array3.length) ? array2 : array3);

  delete array1;
  delete array2;
  delete array3;

  const matchingObjects = maxArr.reduce((matchingObjects, ele) => {
    key = ele.m;
    if (arr1Map[key] && arr2Map[key] && arr3Map[key]) {
      const obj = {};
      for (const [k, value] of Object.entries(ele)) {
        let fieldValues; 
        if(value instanceof Array){
          fieldValues = new Set([...arr1Map[key][k], ...arr2Map[key][k], ...arr3Map[key][k]]);
        }else{
          fieldValues = new Set([arr1Map[key][k], arr2Map[key][k], arr3Map[key][k]]);
        }

        if (fieldValues.size === 1) {
          obj[k] = [...fieldValues][0];
        } else {
          obj[`${k}_arr`] = [...fieldValues];
        }
      }
      matchingObjects.push(obj);
    }
    return matchingObjects;
  }, [])

  return matchingObjects;
}

getMatchingObjects().then(resp => {
  console.log(resp);
})

【讨论】:

猜你喜欢
  • 2016-03-25
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多