【问题标题】:Item search between two array in nodejsnodejs中两个数组之间的项目搜索
【发布时间】:2020-03-28 10:02:26
【问题描述】:

我有两个修复,其中第一个修复是 dataMedical 有一个名为 safeId 的属性,我需要它在 dataSafe 数组,它们由 safeId 的 id 属性关联。

*记住 dataMedical 可以有 N 项以及 dataSafe。*

dataMedical = [
    {
       _id: 5da619b36aae5e7028fc27db,
       paciente: 5de31abf4c430918a39a7490,
       seguroAfiliado: 5d65da2f008b72055d17abfb,
       fecha: '2019-10-01T03:00:00.000Z',
       motivoConsulta: 'dww',
       __v: 0
     }
 ]


dataSafe = [ { _id: 5d65da2f008b72055d17abfb,
    nombre: 'La Seguridad',
    email: 'info@laseguridad.com.ve',
    numeroPoliza: '123456',
    pais: 'fdsaafsd',
    baremo: 'afdafds',
    actoQuirurgico: 'fsdasafd',
    __v: 0 },
 { _id: 5d62c609e7179a084ef359fd,
     nombre: 'Mappfre',
     email: 'info@mappfre.com',
     numeroPoliza: '098765',
     actoQuirurgico: 'acto2',
     baremo: 'rweq',
     pais: 'usa' } ]

结果我需要:

dataMedicalResult = [
    {
       _id: 5da619b36aae5e7028fc27db,
       paciente: 5de31abf4c430918a39a7490,
       seguroAfiliado: 5d65da2f008b72055d17abfb,
       fecha: '2019-10-01T03:00:00.000Z',
       motivoConsulta: 'dww',
       nameSafe: 'La Seguridad',
       email: 'info@laseguridad.com.ve',
       numeroPoliza: '123456',
       pais: 'fdsaafsd',
       baremo: 'afdafds',
       actoQuirurgico: 'fsdasafd',
    }
]

再次尝试所有代码并回答我这个问题:

https://ramdajs.com/repl/?v=0.26.1#?%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22%24__%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22strictMode%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22selected%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22getters%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22_id%22%3A%20%225da619b36aae5e7028fc27db%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22wasPopulated%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22activePaths%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22paths%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_id%22%3A%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22paciente%22%3A%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22seguroAfiliado%22%3A%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fecha%22%3A%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22motivoConsulta%22%3A%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22__v%22%3A%20%22init%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22states%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ignore%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22default%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22init%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_id%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22paciente%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22seguroAfiliado%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22fecha%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22motivoConsulta%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22__v%22%3A%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22modify%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22require%22%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22stateNames%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22require%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22modify%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22init%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ignore%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22pathsToScopes%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22cachedRequired%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22session%22%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%24setCalled%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22emitter%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_events%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_eventsCount%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_maxListeners%22%3A%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%24options%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22skipId%22%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22isNew%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22willInit%22%3A%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22isNew%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22_doc%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22_id%22%3A%20%225da619b36aae5e7028fc27db%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22paciente%22%3A%20%225de31abf4c430918a39a7490%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22seguroAfiliado%22%3A%20%225d65da2f008b72055d17abfb%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22fecha%22%3A%20%222019-10-01T03%3A00%3A00.000Z%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22motivoConsulta%22%3A%20%22dww%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22__v%22%3A%200%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22%24locals%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%22%24init%22%3A%20true%0A%20%20%20%20%7D%0A%5D

当前答案:

使用值 'safes' 和 'citasMedicas' 修改的代码:

POSTMAN 的结果:

【问题讨论】:

标签: javascript arrays node.js reduce ramda.js


【解决方案1】:

我可以这样写:

const enhance = (safe) => (
  med,
  {_id, ...rest} = safe .find (({_id}) => _id == med.safeId) || {}
) => ({...med, ...rest})

const enhanceAll = (safe) => R.map (enhance (safe))


const dataMedical = [{_id: "1", pacient: "Jhon", safeId: "1", data: "2019-10-01T03:00:00.000Z", consult: "dww", __v: 0}]
const dataSafe = [{_id: "1", nameSafe: "La Seguridad"}, {_id: "2", nameSafe: "Mappfre"}]

console .log (
  enhanceAll (dataSafe) (dataMedical)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

请注意,这几乎不使用 Ramda,仅使用 map 函数。我绝不会仅仅为此而介绍 Ramda,但如果我已经在使用 Ramda,这比本机版本更好,因为提供给 Array.prototype.mapindexarray)的附加参数会干扰enhance中的默认参数:

const enhanceAll = (safe) => (meds) => meds .map ( med => enhance (safe) (med))

更新

随着对问题的更改,搜索词必须从 safeId 更改为 seguroAfiliado,使代码看起来像

const enhance = (safe) => (
  med,
  {_id, ...rest} = safe .find (({_id}) => _id == med.seguroAfiliado) || {}
) => ({...med, ...rest})

const enhanceAll = (safe) => R.map (enhance (safe))

你可以在Ramda's REPL看到这个运行。

更新 2

我在节点上试过了,效果很好:

index.js

const R = require('ramda');

const dataMedical = [
  {
     _id: '5da619b36aae5e7028fc27db',
     paciente: '5de31abf4c430918a39a7490',
     seguroAfiliado: '5d65da2f008b72055d17abfb',
     fecha: '2019-10-01T03:00:00.000Z',
     motivoConsulta: 'dww',
     __v: 0
   }
]

const dataSafe = [ { 
  _id: '5d65da2f008b72055d17abfb',
  nombre: 'La Seguridad',
  email: 'info@laseguridad.com.ve',
  numeroPoliza: '123456',
  pais: 'fdsaafsd',
  baremo: 'afdafds',
  actoQuirurgico: 'fsdasafd',
  __v: 0 
}, {
  _id: '5d62c609e7179a084ef359fd',
  nombre: 'Mappfre',
  email: 'info@mappfre.com',
  numeroPoliza: '098765',
  actoQuirurgico: 'acto2',
  baremo: 'rweq',
  pais: 'usa' 
} 
]

const enhance = (safe) => (
  med,
  {_id, ...rest} = safe .find (({_id}) => _id == med.seguroAfiliado) || {}
) => ({...med, ...rest})

const enhanceAll = (safe) => R.map (enhance (safe))

console .log (
  JSON.stringify(
    enhanceAll (dataSafe) (dataMedical), 
    null, 
    4
  )
)
> npm install ramda
[...]
> node --version
v10.15.0
> node index
[
    {
        "_id": "5da619b36aae5e7028fc27db",
        "paciente": "5de31abf4c430918a39a7490",
        "seguroAfiliado": "5d65da2f008b72055d17abfb",
        "fecha": "2019-10-01T03:00:00.000Z",
        "motivoConsulta": "dww",
        "__v": 0,
        "nombre": "La Seguridad",
        "email": "info@laseguridad.com.ve",
        "numeroPoliza": "123456",
        "pais": "fdsaafsd",
        "baremo": "afdafds",
        "actoQuirurgico": "fsdasafd"
    }
]

【讨论】:

  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
  • 对不起,@DenisAlayza,我不确定你在问什么。这在 Ramda REPL 中运行良好。 (这就是我开发它的地方。)它在节点环境中工作,例如在repl.it/@CrossEye/SO-question-59161831
  • 谢谢Scott,不要给我解释清楚,如果我刚才编辑的结果发生变化,结果是空的。
  • @DenisAlayza:但是您更改了正在比较的属性的名称。您需要更改代码以匹配,即将safeId更改为seguroAfiliado。请参阅上面答案中的更新。
  • 拜托,如果你能看到你扔给我的结果,请编辑问题并粘贴一个链接。
【解决方案2】:

您可以使用R.indexBydataSafe 数组转换为使用_id 作为键的字典。现在您可以映射dataMedical 并与来自safeDict 的具有相同safeId 的项目合并:

const { curry, indexBy, prop, merge } = R;

const fn = curry((medical, safe) => {
  const safeDict = indexBy(prop('_id'), safe); // convert the safe array to a dictionary with _id as key
  
  return medical.map(o => merge(safeDict[o.safeId], o)); // map medical and merge with object with same _id from safeDict
});

const dataMedical = [{"_id":"1","pacient":"Jhon","safeId":"1","data":"2019-10-01T03:00:00.000Z","consult":"dww","__v":0}];
const dataSafe = [{"_id":"1","nameSafe":"La Seguridad"},{"_id":"2","nameSafe":"Mappfre"}];

const result = fn(dataMedical, dataSafe)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>

同样的想法可以在没有 Ramda 的情况下轻松使用 - 从 dataSafe 创建一个 Map,然后映射 dataMedical 并使用 safeIdsafeDict 获取一个项目,并使用与当前医疗对象结合传播:

const fn = (medical, safe) => {
  const safeDict = new Map(safe.map(o => [o._id, o])); // convert the safe array to a dictionary with _id as key
  
  return medical.map(o => ({ ...o, ...safeDict.get(o.safeId) })); // map medical and merge with object with same _id from safeDict
};

const dataMedical = [{"_id":"1","pacient":"Jhon","safeId":"1","data":"2019-10-01T03:00:00.000Z","consult":"dww","__v":0}];
const dataSafe = [{"_id":"1","nameSafe":"La Seguridad"},{"_id":"2","nameSafe":"Mappfre"}];

const result = fn(dataMedical, dataSafe);

console.log(result);

【讨论】:

  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
  • const { curry, indexBy, prop, merge } = R; 替换为const { curry, indexBy, prop, merge } = require('ramda')
  • 拜托,如果你能看到你扔给我的结果,请编辑问题并粘贴一个链接。
【解决方案3】:

这也有帮助, 我认为尝试无意义会导致更复杂的方法...

const mergeWithDataSafe = (merger, data) => merger(
  (item) => R.mergeRight(item, R.path([item.safeId, 0], data)),
);

const aggregate = R.useWith(mergeWithDataSafe, [
  R.flip(R.map),
  R.groupBy(R.prop('_id')),
]);


const dataMedical = [
  {
    "_id": "1",
    "pacient": "Jhon",
    "safeId": "1",
    "data": "2019-10-01T03:00:00.000Z",
    "consult": "dww",
    "__v": 0
  }
];


const dataSafe = [
  {
    "_id": "1",
    "nameSafe": "La Seguridad"
  },
  {
    "_id": "2",
    "nameSafe": "Mappfre"
  }
];

console.log(
  aggregate(dataMedical, dataSafe),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>

【讨论】:

  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
【解决方案4】:

您可以使用数组查找功能来定位正确的 dataSafe 元素。我们将映射 dataMedical 中的每个元素,并使用 safeId 找到正确的 dataSafe。然后,我们将 nameSafe 属性复制到保险箱。

let dataMedical = [
    {
        "_id": "1",
        "pacient": "Jhon",
        "safeId": "1",
        "data": "2019-10-01T03:00:00.000Z",
        "consult": "dww",
        "__v": 0
    }
]


let dataSafe = [
    {
        "_id": "1",
        "nameSafe": "La Seguridad"
    },
    {
        "_id": "2",
        "nameSafe": "Mappfre"
    }
]

let dataMedicalResult = dataMedical.map(dm => {
  let safe = dataSafe.find(e => e._id == dm.safeId);
  return safe
    ? {...dm, nameSafe: safe.nameSafe}
    : dm;
})

console.log(dataMedicalResult);

编辑:看起来其他答案没有查看 safeId 属性来找到正确的保险箱,所以这应该是正确的解决方案。

【讨论】:

  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
【解决方案5】:

这样的东西会起作用吗?它在两个数组中搜索给定的 id,然后加入两个找到的对象

const dataMedical = [{
  "_id": "1",
  "pacient": "Jhon",
  "safeId": "1",
  "data": "2019-10-01T03:00:00.000Z",
  "consult": "dww",
  "__v": 0
}]


const dataSafe = [{
    "_id": "1",
    "nameSafe": "La Seguridad"
  },
  {
    "_id": "2",
    "nameSafe": "Mappfre"
  }
]

function findRecord(id) {
  const medical = dataMedical.find(r => r._id === id)
  const safe = dataSafe.find(r => r._id === id)
  return {
    ...medical,
    ...safe
  }

}
const dataMedicalResult = findRecord("1")
console.log(dataMedicalResult)

【讨论】:

  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
  • 那个链接是空的
  • 拜托,如果你能看到你扔给我的结果,请编辑问题并粘贴一个链接。
【解决方案6】:

试试这个:

console.log(dataSafe.reduce((acc,el)=> {
  const dm = dataMedical.find(dam => dam["_id"] === el["_id"]);  
  return dm ? [...acc, Object.assign(el, dm)] : acc;
}, []))

【讨论】:

  • 我猜这是落后的,OP 希望 dataMedical 中的所有项目与 dataSafe 中的对应项一起增强。这会增强 dataSafe 中的项目。
  • 我将代码复制到 > ramdajs.com/repl/?v=0.26.1 中,一切正常,但在 nodejs 中我执行 > var R = require ('ramda');有什么建议吗?
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多