为什么我的合并失败了?map()查找()[javascript]

为什么我的合并失败了?map()查找()[javascript],javascript,node.js,arrays,merge,array-map,Javascript,Node.js,Arrays,Merge,Array Map,在尝试使用map()和find()合并数据以合并两个对象数组时,我一直遇到问题,通常会收到类似于TypeError:cannotread属性“customSku”为null的内容 我选择的对象关键点是正确的,所以我想知道我尝试这样做的方式是否有内在的错误,因为有时它是有效的,有时它不是 我最近的尝试如下: const fs = require('fs') const binLocations = require("../data/json/locations.json");

在尝试使用map()和find()合并数据以合并两个对象数组时,我一直遇到问题,通常会收到类似于
TypeError:cannotread属性“customSku”为null的内容

我选择的对象关键点是正确的,所以我想知道我尝试这样做的方式是否有内在的错误,因为有时它是有效的,有时它不是

我最近的尝试如下:

const fs = require('fs')
const binLocations = require("../data/json/locations.json");
const opsuiteItems = require('../data/json/items.json')

const merged = binLocations.map((item) => {
  itm = opsuiteItems.find((itm) => itm.customSku === item.customSku)
  if (itm) {
    return {
      itemID: item.itemID,
      customSku: itm.customSku,
      defaultCost: itm.vendorCost,
      tag: item.binLocation 
    }
  }
})
有这样的数据:

//opsuiteItems
{
    "active": true,
    "customSku": "H2442",
    "vendorCost": "19",
  }

// binLocations
{
    "itemID": "2840",
    "customSku": "H2442",
    "binLocation": "G"
  }
这是数据量的问题还是?

请尝试此代码

const merged = binLocations.filter((item) => {
  return item != null && opsuiteItems.findIndex((opItem) => opItem.customSku === item.customSku) >= 0;
}).map((item) => {
  const itm = opsuiteItems.find((itm) => itm.customSku === item.customSku)
  if (itm) {
    return {
      itemID: item.itemID,
      customSku: itm.customSku,
      defaultCost: itm.vendorCost,
      tag: item.binLocation 
    }
  }
});
试试这个代码

const merged = binLocations.filter((item) => {
  return item != null && opsuiteItems.findIndex((opItem) => opItem.customSku === item.customSku) >= 0;
}).map((item) => {
  const itm = opsuiteItems.find((itm) => itm.customSku === item.customSku)
  if (itm) {
    return {
      itemID: item.itemID,
      customSku: itm.customSku,
      defaultCost: itm.vendorCost,
      tag: item.binLocation 
    }
  }
});

.map
希望始终返回某些内容。使用
forEach
循环并执行条件合并

const merged = [];

binLocations.forEach(item => {
  const match = item && opsuiteItems.find(el => el.customSku === item.customSku);

  if (match) {
    merged.push({
      itemID: item.itemID,
      customSku: item.customSku,
      defaultCost: match.vendorCost,
      tag: item.binLocation 
    });
  }
});

.map
希望始终返回某些内容。使用
forEach
循环并执行条件合并

const merged = [];

binLocations.forEach(item => {
  const match = item && opsuiteItems.find(el => el.customSku === item.customSku);

  if (match) {
    merged.push({
      itemID: item.itemID,
      customSku: item.customSku,
      defaultCost: match.vendorCost,
      tag: item.binLocation 
    });
  }
});


这两个数组都是通过异步操作填充的吗?从错误描述中可以看出,您没有等待数组具有值,其中一个值为空。它清楚地表明您没有任何东西与opsuiteItems数组中的当前项匹配。“如果我尝试执行此操作的方式存在固有错误”-如果不打算为数组中的每个元素返回某些内容,则不应使用
.map()
@nip,它们是使用require从文件导入的。@Andreas我不知道这一点。我应该怎么做呢?这两个数组都是通过异步操作填充的吗?从错误描述中可以看出,您没有等待数组具有值,其中一个值为空。它清楚地表明您没有任何东西与opsuiteItems数组中的当前项匹配。“如果我尝试执行此操作的方式存在固有错误”-如果不打算为数组中的每个元素返回某些内容,则不应使用
.map()
@nip,它们是使用require从文件导入的。@Andreas我不知道这一点。我应该怎么做呢?有什么问题吗?现在,代码更新了,问题是'。现在再试一次。是的,我发现了,把它拿走了。js:21 itm=optSuiteItems.find((itm)=>itm.customSku===item.customSku)类型错误:无法读取null的属性“customSku”。它的行为就好像item.customSku不存在一样。没有定义变量,如仍然不起作用的
const itm
,您的代码看起来应该处理是否缺少customSku的问题,对吗?有什么问题吗?现在,代码已更新,问题是“额外的”)。现在再试一次。是的,我发现了,把它拿走了。js:21 itm=optSuiteItems.find((itm)=>itm.customSku===item.customSku)类型错误:无法读取null的属性“customSku”。它的行为就好像item.customSku不存在一样。它没有定义变量,如
const itm
,但仍然不起作用。如果缺少customSku,代码看起来应该处理,对吗?它仍然在item.customSku上失败,就好像item.customSku不存在一样。尽管确实如此。如果block
console.log(item,itm),您是否能够在之前控制台记录数据?它记录了一些。。。也许数据丢失了某个自定义SKU,但肯定不应该。是的,它们都是console.log,哈哈,好主意哈哈。。。在数组
数据中有
null
。这就是原因。知道了。它在item.customSku上仍然失败,就好像item.customSku不存在一样。尽管确实如此。如果block
console.log(item,itm),您是否能够在之前控制台记录数据?它记录了一些。。。也许数据丢失了某个自定义SKU,但肯定不应该。是的,它们都是console.log,哈哈,好主意哈哈。。。在数组
数据中有
null
。这就是原因。知道了。