Javascript / Typescript从另一个嵌套数组中的数据更新数据

时间:2019-01-17 06:29:06

标签: javascript arrays typescript

我的初始数组是这样的:

preData = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

具有值的数组是这样的:

  finalData= [
        ['APP_NOT_RUNNING', 2],
        ['FALLBACK', 0],
        ['IDLE', 3],
        ['OUTOFSERVICE', 0]
    ];

我想从第二个数组中更新第一个数组的值,即结果:

{{1}}

我将不胜感激

5 个答案:

答案 0 :(得分:2)

您可以使用Map().forEach()数组方法:

let arr1 = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];

let arr2 = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

let updateArray = (a1, a2, map = new Map()) => {
  a1.forEach(arr => map.set(arr[0], arr));
  a2.forEach(arr => map.set(arr[0], arr));
  
  return [...map.values()];
};

console.log(updateArray(arr1, arr2));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

一种可能的解决方案是将初始数组转换为Map,对其进行更新并将其转换回数组:

const preData = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];

const valueData = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

const map = new Map(preData);

for (const [key, value] of valueData) {
    map.set(key, value);
}

const result = Array.from(map);
console.log(result);

更新-可能是:

const preData: ReadonlyArray<[string, number]> = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];

const valueData: Array<[string, number]> = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

答案 2 :(得分:0)

将索引“ 0”的第二个数组actualData的内容与原始数组preData索引“ 0”匹配。如果匹配,则将actualData的索引“ 1”(值)的内容复制到原始数组中。

var preData = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];
var actualData = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

preData.forEach((ele, idx, arr) =>{
        actualData.forEach(item =>{
                       if(item[0] === ele[0]){
                           ele[1] = item[1];
                           arr[idx] = ele;
                        }
                   });
});
console.log(preData);

答案 3 :(得分:0)

您将需要遍历preData数组,并检查ActualData数组中每个值是否存在一个值。如果不是,则将默认值valye推送到finalData数组,如果是,则添加值,然后推送它。

使用 forEach 遍历preData数组,并使用 filter 检查preData中每个值是否存在数据。

    const preData = [
      ['APP_NOT_RUNNING', 0],
      ['FALLBACK', 0],
      ['IDLE', 0],
      ['OUTOFSERVICE', 0]
    ];
    
    const actualData = [
      ['APP_NOT_RUNNING', 2],
      ['IDLE', 3],
    ];
    
    const finalData = [];
    
    preData.forEach(preDataValue => {
      const index = finalData.push(preDataValue);
      const data = actualData.filter(d => d[0] === preDataValue[0]);
      if (data.length) {
        finalData[index-1][1] += data[0][1];
      }
    });

    console.log(finalData);

答案 4 :(得分:0)

我们可以使用.map.find

preData = [
    ['APP_NOT_RUNNING', 0],
    ['FALLBACK', 0],
    ['IDLE', 0],
    ['OUTOFSERVICE', 0]
];

preData2 = [
    ['APP_NOT_RUNNING', 2],
    ['IDLE', 3],
];

const finalData = preData.map(x=>{
  const found = preData2.find(y=>y[0]===x[0])
  if(found)
    x[1] = found[1]
  return x;
})

console.log(finalData);