假设我有一个对象,它包含3个不同大小的数组,其中包含字符串作为它们各自的元素类型,还有冗余属性,您不想迭代:例如,如下所示:
let a = 'a7'
for (let i=0; i<testobj.prop1.length; i++){
if (a == testobj.prop1[i])
testobj.prop1.splice(i, 1)
}
for (let i=0; i<testobj.prop2.length; i++){
if (a == testobj.prop2[i])
testobj.prop2.splice(i, 1)
}
for (let i=0; i<testobj.prop3.length; i++){
if (a == testobj.prop3[i])
testobj.prop3.splice(i, 1)
}
当然,如果我希望拼接一个可能存在于这三个数组中的任何一个中的特定值,我可以这样做:
6
10
50
120
420
1220
2220
这是令人讨厌的,并且超级容易出错,从长远来看也不是很容易扩展。
使用更高阶函数来解决此问题的最佳功能方法是什么?例如.map,.reduce,.sort,.filter?
答案 0 :(得分:3)
您可以通过获取数组所需值的索引来获取对象和拼接的值。
虽然数组中只需要一个元素,但如果元素被拆分,您可以使用Array#some
并提前返回。
var testobj = { foo: 42, prop1: ['a1','a2','a3'], prop2: ['a4','a5'], prop3: ['a7'] },
value = 'a7';
Object
.values(testobj)
.some(a => Array.isArray(a) && a.includes(value) && a.splice(a.indexOf(value), 1));
console.log(testobj);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
一个简单的详细解决方案,但如果找到了项目,它会限制额外的迭代。您可以在日志中看到它。如果该项目位于第一个数组中,则只检查第一个数组。
let testobj = {
prop3: ['a7'],
prop1: ['a1','a2','a3'],
prop2: ['a4','a5']
};
Object.values(testobj).find((prop, index) => {
console.log(`index ${index}`);
const foundIndex = prop.findIndex(i => i !== 'a7');
return foundIndex ? (prop.splice(foundIndex, 1), true) : false;
});
console.log(testobj);
&#13;