【问题标题】:Unable to push array values dynamically comparing two arrays无法动态推送数组值比较两个数组
【发布时间】:2018-09-05 11:21:22
【问题描述】:

我有两个角度数组。

一个是常规数组 A,其值为 ['Stock_Number', 'Model', 'Type', 'Bill_Number']

另一个是关联数组B,如下所示

0:[
  {
    'Stock_Number': 'GTH738', 
    'Model': 'sample_model', 
    'Type': 'sample_type', 
    'Bill_Number': 7784754,
    'some_prop1': 'prop1_val',
    'some_prop2': 'prop2_val'
  }
];

两个数组都是动态的。 B 的列也比 A 多。A 具有 B 的键(A 是 B 的子集)我想仅为 A 中的元素获取一个新数组 C。为此,我正在检查 B 中是否存在键。以下是我的代码

for(var i=0,j=0; i<B.length,j<A.length; i++,j++){
        if (!B.hasOwnProperty(A)) {
           var value = A[j];
                console.log('if-'+value); //printing value 
                console.log(B[0].value); // printing undefined 
               // C.push(B[0].value);
        }else{
            //some code
        }
    }

结果数组应该如下所示

{
'Stock_Number': 'GTH738', 
'Model': 'sample_model', 
'Type': 'sample_type', 
'Bill_Number': 7784754
}

有人可以建议我如何实现这一点吗?

【问题讨论】:

  • 您能否澄清一下,在 B 中,它看起来像:{ 0: [{'Stock_Number' ...? 0 是属性?
  • 你想要的数组 C 的结构是什么?
  • 是的,实际上它是一个通过 API 结果获取的 JSON 数组。这是索引
  • @Ankit 它会是关联数组,就像 B 一样,带有库存编号和相关值
  • 请选择一个示例,其中想要的结果(也请添加)是可能的。

标签: javascript angular typescript


【解决方案1】:

您可以使用这种方法。为了更好地举例说明您需要什么,我在 B 数组的对象上添加了一些额外的属性,这些属性不在数组 A 中。因此,这些属性被排除在数组 C 中的对象之外

var A = ['Stock_Number', 'Model', 'Type', 'Bill_Number'];
var B = [
  {
    'Stock_Number': 'GTH738', 
    'Model': 'sample_model', 
    'Type': 'sample_type', 
    'Bill_Number': 7784754
  },
  {
    'Stock_Number': 'GTH740', 
    'Model': 'sample_model2', 
    'Type': 'sample_type2', 
    'Bill_Number': 7784754,
    'someProp1': 1,
    'someProp2': 2,
  }
];

var C = [];
for(var i=0; i<B.length; i++){
  var obj = B[i];
  var objKeys = Object.keys(obj);
  var resObj = {};
  A.forEach(function(itemA){
    if(objKeys.indexOf(itemA) !== -1){
      resObj[itemA] = obj[itemA];
    }
  });
  C.push(resObj);
}

console.log(C);

【讨论】:

  • B 只有一个对象,没有多个对象。我编辑了我的 B,它看起来像我的
  • includes 关键字在 Angular 中不起作用。有什么选择吗?
  • 您可以使用indexOf。我已经使用它更新了我的答案。 @Esco
【解决方案2】:

只要换行

console.log(B[0].value); 

console.log(B[0][value]);

【讨论】:

  • 不允许这样
【解决方案3】:

您可以过滤未知键并从多余的键中构建一个新对象。

var arrayA = ['Stock_Number', 'Model', 'Type', 'Bill_Number'],
    arrayB = [{ Stock_Number: 'GTH738', Model: 'sample_model', Type: 'sample_type', Bill_Number: 7784754 }, { Stock_Number: 'GTH738', Model: 'sample_model', Type: 'sample_type', Bill_Number: 7784754, foo: 'bar', baz: 42 }],
    result = [];

arrayB.forEach(function (b) {
    keys = Object.keys(b).filter(k => !arrayA.includes(k));
    if (keys.length) {
        result.push(Object.assign(...keys.map(k => ({ [k]: b[k] }))));
    }
});

console.log(result);

【讨论】:

    【解决方案4】:
    var A = ['Stock_Number', 'Model', 'Type', 'Bill_Number'];
    var B = [
      {
        'Stock_Number': 'GTH738', 
        'Model': 'sample_model', 
        'Type': 'sample_type', 
        'Bill_Number': 7784754
      },
      {
        'Stock_Number': 'GTH740', 
        'Model': 'sample_model2', 
        'Type': 'sample_type2', 
        'Bill_Number': 7784754,
        'someProp1': 1,
        'someProp2': 2,
      }
    ];
    
    var C = B.map(item =>{
        let obj = {};
        A.forEach(key => {
            obj[key] = item[key];
        });
        return obj;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多