Javascript 阵列拼接中的非唯一对象

Javascript 阵列拼接中的非唯一对象,javascript,Javascript,我正在尝试从两个现有阵列中创建一个新阵列 有一个totalStock变量包含商店中的所有商品 有一个currentStock,其中包含当前库存中的项目 现在我需要一个包含没有库存的物品的备用物品,问题是有些物品的名称相同,因为它抛出了错误的结果 在stock数组中,存在共享相同id的对象。下面代码的结果应该是一个数组,其中包含idMetal和Wood的对象,但它只返回Metal var totalStock = [ {id:'Wood'}, {id:'Metal'}, {id:'W

我正在尝试从两个现有阵列中创建一个新阵列

  • 有一个totalStock变量包含商店中的所有商品
  • 有一个currentStock,其中包含当前库存中的项目
  • 现在我需要一个包含没有库存的物品的备用物品,问题是有些物品的名称相同,因为它抛出了错误的结果
在stock数组中,存在共享相同
id
的对象。下面代码的结果应该是一个数组,其中包含
id
Metal和Wood的对象,但它只返回Metal

 var totalStock = [
    {id:'Wood'}, {id:'Metal'}, {id:'Wood'}, {id:'Wood'}, {id:'Stone'}
];

var inStock = [
    {id:'Wood'}, {id:'Wood'}, {id:'Stone'} /* Metal is no longer in stock, nor is Wood */
];

var outStock = totalStock.filter(item => {
  return !inStock.some(inStockItem => inStockItem.id === item.id);
});

console.log(outStock); /* This only returns Metal but should also be returning wood */

更新代码

var totalStock = [
    {id:'Wood'}, {id:'Metal'}, {id:'Wood'}, {id:'Wood'}, {id:'Stone'}
];

var inStock = [
    {id:'Wood'}, {id:'Wood'}, {id:'Stone'} /* Metal is no longer in stock, nor is Wood */
];

function calculateStock(stockArray){
    var totalStockAmount = {};
  stockArray.forEach(function(item){
    totalStockAmount[item.id] = 0;
  });

  stockArray.forEach(function(item){
    totalStockAmount[item.id] = totalStockAmount[item.id] + 1;
  });
  return totalStockAmount;
}

var totalStockAmount = calculateStock(totalStock),
        totalInStockAmount = calculateStock(inStock);

Object.keys(totalStockAmount).forEach(function(stock){
    if(!totalInStockAmount[stock]) totalInStockAmount[stock] = 0;
    totalInStockAmount[stock] = totalStockAmount[stock] - totalInStockAmount[stock];
 });

var noStockAmount = totalInStockAmount,
        noStock = [];

Object.keys(noStockAmount).forEach(function(stock){
    var amount = noStockAmount[stock];
  for(var x = 0; x < amount; x++){
    noStock.push({id:stock});
  }
});

console.log(noStock);
var totalStock=[
{id:'Wood'},{id:'Metal'},{id:'Wood'},{id:'Wood'},{id:'Stone'}
];
var inStock=[
{id:'Wood'},{id:'Wood'},{id:'Stone'}/*金属不再有库存,木材也不再有库存*/
];
函数calculateStock(stockArray){
var totalStockAmount={};
stockArray.forEach(函数(项){
totalStockAmount[item.id]=0;
});
stockArray.forEach(函数(项){
totalStockAmount[item.id]=totalStockAmount[item.id]+1;
});
返回总库存量;
}
var totalStockAmount=计算库存(totalStock),
总库存金额=计算库存(库存);
Object.key(totalStockAmount).forEach(函数(stock){
如果(!totalInStockAmount[stock])totalInStockAmount[stock]=0;
totalInStockAmount[库存]=totalStockAmount[库存]-totalInStockAmount[库存];
});
var noStockAmount=totalInStockAmount,
鼻孔=[];
Object.keys(noStockAmount).forEach(函数(库存){
var金额=库存金额[股票];
对于(变量x=0;x
您需要对每种方法的计数进行比较

为inStock创建一个计数哈希图,如下所示:

{Wood:2, Stone:1}

然后,您可以在过滤totalStock时进行扣除,如果该属性不存在或为零,您就知道它缺货了。我认为最终解决此问题的方法是使您的数据结构更有意义。我正在努力理解一切,但似乎ID是一个非唯一的键含义类型?我想这里面有更多的数据?缺货的意思是…我说不出来,因为你说木材缺货,但很明显有两种。我猜那是…不同的木头?那么,缺货是指一系列的商品,意味着至少有一个已经售出?我要…去处理那个混蛋,但我可能是误会了

如果这些是不同的东西,您需要有一些唯一的标识符。而且,嗯,这可能就是身份证


我建议使用一个包含所有产品的对象(可能由ID键入以便于检索),只使用ID存储库存/缺货,这样就不会复制数据

e、 g


我想我误解了您希望每个数据是什么,但是像这样扁平化您的数据会给您带来更轻松的时间,并且可能会解决很多问题。

请注意Stackoverflow不是免费的代码编写服务。您很幸运地从前面的问题中得到了没有明确说明您的问题的筛选代码。。但是,为了让其他人让它更健壮,然后将其复制到一个新问题上,这并不是这个网站的工作方式。这里的目标是让您尝试解决自己的问题,而其他人则帮助您解决问题code@charlietfl那么至少告诉我谷歌搜索的目的是什么,哈哈。我已经浏览了好几个小时了,试着找到这个问题。我在下面给了你们一个基本过程的概要。现在自己尝试第一部分。当您遇到问题时,请告诉我们您尝试了什么查看更新的代码:3查看更新的代码,我觉得我已经解决了复杂的问题,但我想它是可行的。这里可能有一个使用filter和reduce的更简单版本
var products = {
    1001: {
        id: 1001,
        type: 'wood',
        otherData: 'redwood',
    },
    1002: {
        id: 1002,
        type: 'wood',
        otherData: 'oak',
    },
    1003: {
        id: 1003,
        type: 'stone',
        otherData: 'limestone',
    },
    // etc
}


var totalStock = {
    1001: 4,
    1002: 4,
    1003: 6,
}

var inStock = {
    1001: 2,
    1002: 0,
    1003: 1,
}

var outStock = Object.keys(totalStock).filter(id => !inStock[id]); // [1002]