迭代整个javascript对象并修改所有类型的值

时间:2017-04-16 00:44:33

标签: javascript

我需要对可以拥有嵌套对象和数组的javascript对象进行深度迭代,我需要对所有数值执行一个函数并修改对象。

例如,假设我需要将每个数字乘以2.

const foo = (obj) => {
    // multiply every numeric value by 2 
};

const modified = foo({
    a: 0,
    b: 3,
    c: {
      d: 4,
      e: {
          f: 6,
          g: [ 0, 3, 7, 3 ]
      }
    }
});

修改后的值应为:

{
    a: 0,
    b: 6,
    c: {
      d: 8,
      e: {
          f: 12,
          g: [ 0, 6, 14, 6 ]
      }
    }
}

由于人们通常想知道你尝试了什么,所以这里是我在完全难倒之前得到的。

const obj = {};
for(key in object) {
    const item = object[key];
    if(typeof item === 'object') {
        // The levels deep is dynamic, so how would I keep doing this..
    } else if(typeof item === 'array') {
        obj[key] = item.map((a, b) => a * 2);
    } else if(!isNaN(item)) {
        obj[key] = item * 2;
    }
}

3 个答案:

答案 0 :(得分:2)

在这种情况下,你可能想要递归。此实现适用于任何类型的对象和您提供的映射函数,也就是非常通用的

function mapper(obj, mappingFn, result) {
  if (!result)
      result = {};
  Object.keys(obj)
        .forEach(key => {
            switch (typeof obj[key]) {
                case 'string':
                case 'number':
                    result[key] = mappingFn(obj[key]);
                    break;
                // if obj[key] is an array, it still returns 'object', so we are good
                case 'object':
                    mapper(obj[key], mappingFn, result);
                    break;
            }
        });
  return result;
}

let data = {
    a: 0,
    b: 3,
    c: {
      d: 4,
      e: {
          f: 6,
          g: [ 0, 3, 7, 3 ]
      }
    }
};

let result = mapper(data, value => value * 2);
console.log(result) // everything should be multiplied by 2

答案 1 :(得分:2)

使用递归并扩展您的解决方案

function multiplyByTwo(objectToParse) {
  const obj = {};
  for (key in objectToParse) {
    const item = object[key];
    if (typeof item === 'object') {
        obj[key] = multiplyByTwo(item);
    } else if (typeof item === 'array') {
      obj[key] = item.map((a, b) => a * 2);
    } else if (!isNaN(item)) {
      obj[key] = item * 2;
    }
  }
  return obj;
}

const result = multiplyByTwo(object);

答案 2 :(得分:-2)

这是我的解决方案。

const foo = (obj, operation) => {
  let afterObj = obj;

  for(item in afterObj) {
    if(typeof afterObj[item] == "object") {
        foo(afterObj[item], operation);
    } else if (typeof afterObj[item] = "string") {
    } else {
        afterObj[item] = operation(afterObj[item]);
    }
  }

  return afterObj;
};

const modified = foo({
    a: 0,
    b: 3,
    c: {
      d: 4,
      e: {
          f: 6,
          g: [ 0, 3, 7, 3 ]
      }
    }
}, function(x) { return x*2 });