数组的映射值

Mapping values of an array

我的 Json 数组如下

[
  {Priority: low,
Status: received
Creator: ABC
},
 {Priority: high,
Status: received
Creator: DEF
}
  ]

我需要映射优先级字段的值,优先级字段必须映射到颜色,值如下

[
  {color: Orange,
Status: received
Creator: ABC
},
 {color: red,
Status: received
Creator: DEF
}

  ]

您不需要 lodash 或下划线,Array.prototype.map 可以提供帮助:

let originArray = [
  {Priority: 'low',
    Status: 'received',
    Creator: 'ABC'
  },
  {Priority: 'high',
    Status: 'received',
    Creator: 'DEF'
  }
];

function getColorFromPriority(priority) {
  if (priority === 'low') {
    return 'yellow';
  } else if (priority === 'high') {
    return 'red';
  }
}

let resultArray = originArray.map(function(o) {
  o.color = getColorFromPriority(o.Priority);
  delete o.Priority;
  return o;
});

console.log(resultArray);

仅使用 JavaScript 你可以使用 Array.prototype.map() along with Object.keys() 你可以遍历你的数组和 return 另一个带有自定义对象的数组。

这就是你的代码:

var filteredResults = data.map(function(item) {
  var obj = {};
  Object.keys(item).forEach(function(k) {
    if (k !== 'Priority' && item.hasOwnProperty(k)) {
      obj[k] = item[k]
    } else if (k === 'Priority' && item.hasOwnProperty(k)) {
      if (item[k] === 'low') obj['color'] = 'Orange';
      else if (item[k] === 'high') obj['color'] = 'Red';
    }
  });
  return obj;
});

演示:

这是一个有效的演示片段:

var data = [{
    Priority: 'low',
    Status: 'received',
    Creator: 'ABC'
  },
  {
    Priority: 'high',
    Status: 'received',
    Creator: 'DEF'
  }
];

var filteredResults = data.map(function(item) {
  var obj = {};
  Object.keys(item).forEach(function(k) {
    if (k !== "Priority" && item.hasOwnProperty(k)) {
      obj[k] = item[k]
    } else if (k === 'Priority') {
      if (item[k] === 'low') obj['color'] = 'Orange';
      else if (item[k] === 'high') obj['color'] = 'Red';
    }
  });
  return obj;
});

console.log(filteredResults);


改进:

你可以看到我在这里使用了两个 if 块来测试 Priority 个关卡:

if (item[k] === 'low') obj['color'] = 'Orange';
else if (item[k] === 'high') obj['color'] = 'Red';

如果您有更多 Priority 级别,您最好使用自定义 object 来存储这些级别及其各自的颜色,例如:

var levels = {"low" : "Orange", "high": "Red"}

然后只需使用这些级别 keys 即可获得相应的 Color,如下所示:

obj['color'] = levels[item[k]];

您可以使用 Array#map 和一个将存储优先级和颜色之间的映射的对象来实现

如果您需要更多优先级颜色 - 将它们添加到 mappingColors 对象中,其余代码保持不变

const data = [{
    Priority: 'low',
    Status: 'received',
    Creator: 'ABC'
  },
  {
    Priority: 'high',
    Status: 'received',
    Creator: 'DEF'
  }
];

const mappingColors = {
  low: 'orange',
  high: 'red',
}

let finalArray = data.map(d => (d.Color = mappingColors[d.Priority],delete d.Priority, d));
console.log(finalArray);

正如其他答案所述,这可以在没有 Lodash 的情况下完成。要添加一个 Lodash(带有 ES6)选项 none the less:

let arr = [  {Priority: 'low',Status: 'received', Creator: 'ABC'}, {Priority: 'high',Status: 'received', Creator: 'DEF'}  ];

let colors = new Map([['low', 'Orange'],['high', 'Red']]);
let res= arr.map(o=> _.assign({color:colors.get(o.Priority)},_.omit(o,'Priority')));

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>