我有一些数据要清理。对于有问题的字段,我知道可能的值是什么,但该值存储在一个连接的字符串中,我需要它们在一个数组中。这是我想做的事情:
var valid_values = ['Foo', 'Bar', 'Baz'];
var raw_data = ['BarFoo','BazBar','FooBaz'];
desired_result = [['Bar','Foo'],['Baz','Bar'],['Foo','Baz']];
我不确定这叫什么,所以我希望这不是重复的。
我有一些数据要清理。对于有问题的字段,我知道可能的值是什么,但该值存储在一个连接的字符串中,我需要它们在一个数组中。这是我想做的事情:
var valid_values = ['Foo', 'Bar', 'Baz'];
var raw_data = ['BarFoo','BazBar','FooBaz'];
desired_result = [['Bar','Foo'],['Baz','Bar'],['Foo','Baz']];
我不确定这叫什么,所以我希望这不是重复的。
您可以遍历每个数据值,使用indexOf或contains搜索允许的字符串,并将成功的匹配项作为数组返回。
这是我在 jsFiddle的代码版本和工作示例:
var out = raw_data.map(function (raw) {
return valid_values.filter(function (value) {
return raw.contains(value);
});
});
//out === [['Bar','Foo'],['Baz','Bar'],['Foo','Baz']];
我认为输出匹配顺序并不重要。
这是假设有关您的数据的一些事情:
在这种情况下,你会想做这样的事情:
// for each item in the desired result, see if it's a match
// at the beginning of the string,
// then split on the string version of the valid value
function transform(input){
for(i = 0; i < len; i++) {
if (input.indexOf(valid_values[i]) === 0) {
return [ valid_values[i], input.split(valid_values[i])[1] ];
}
}
return [];
}
// to run on your input
var j = 0, raw_len = raw_data.length, desired_result = [];
for(; j < raw_len; j++) {
desired_result.push(transform(raw_data[j]));
}
此代码非常特定于您提出的答案;它不涵盖许多边缘情况。